Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有常量的模板专门化;模版实例化不明确“;gcc上有错误,但不是叮当声_C++_Gcc_Clang_C++17_Template Specialization - Fatal编程技术网

C++ 带有常量的模板专门化;模版实例化不明确“;gcc上有错误,但不是叮当声

C++ 带有常量的模板专门化;模版实例化不明确“;gcc上有错误,但不是叮当声,c++,gcc,clang,c++17,template-specialization,C++,Gcc,Clang,C++17,Template Specialization,下面的代码在clang上编译(我尝试了7和8),但没有使用gcc(7、8或9),所有这些都使用--std=c++17。有了gcc,我得到了一个模棱两可的模板实例化错误,如您在这里看到的: 我可以通过取消注释#define fix\u gcc来修复它。如果我将traits的专门化中的first\u type和first\u type更改为C和const C,它也会编译,但在我的真实代码中,如果有一些则会启用\u If\u t,以缩小那里的专门化 gcc在这里错了吗?还是我做错了什么事情,而叮当恰好

下面的代码在clang上编译(我尝试了7和8),但没有使用gcc(7、8或9),所有这些都使用
--std=c++17
。有了gcc,我得到了一个模棱两可的模板实例化错误,如您在这里看到的:

我可以通过取消注释
#define fix\u gcc
来修复它。如果我将
traits
的专门化中的
first\u type
first\u type
更改为
C
const C
,它也会编译,但在我的真实代码中,如果有一些
则会启用\u If\u t
,以缩小那里的专门化

gcc在这里错了吗?还是我做错了什么事情,而叮当恰好接受了

更新:在专业化中删除一层模板,即
Map
,即使模板别名为
first\u type
,也会让GCC感到高兴,请参阅

:在函数“int main()”中:
:36:38:错误:“struct traits”的模板实例化不明确
36 | std::cout>>{
静态constexpr int N=2;
};
#恩迪夫
模板
结构特征{
静态constexpr int N=3;
};
int main(){

std::cout在我看来像一个bug,但我不能完全确定。如果将
first_type
别名更改为
C
const C
,gcc没有问题,但是使用别名模板应该等同于立即替换别名定义,除非任何未使用的模板参数仍然需要更改使用模板参数替换并检查SFINAE效果的语义。如果您想稍微简化示例,可以使用first_type=T;
first_type
定义为
模板,这样就可以避免
特征定义中的
无效
(为修复程序维护
std::启用\u if\u t
).无论如何,我打赌我的2美分在一个g++错误中:
N=3
版本应该比
N=2
版本更专业。但我不是语言层,所以我会等待专家。谢谢,我应用了简化。我还测试了删除
Map
,这也让GCC感到高兴,请参阅上面的更新。如果需要,我会稍等一点其他人有一些想法,也许其他人会向gcc提交错误报告。请参阅
<source>: In function 'int main()':
<source>:36:38: error: ambiguous template instantiation for 'struct traits<Map<const Foo> >'
   36 |   std::cout << traits<Map<const Foo>>::N << std::endl;
      |                                      ^~
<source>:24:8: note: candidates are: 'template<class C> struct traits<Map<first_type<C> > > [with C = const Foo]'
   24 | struct traits<Map<first_type<C>>> {
      |        ^~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:30:8: note:                 'template<class C> struct traits<Map<first_type<const C> > > [with C = Foo]'
   30 | struct traits<Map<first_type<const C>>> {
      |        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:36:40: error: incomplete type 'traits<Map<const Foo> >' used in nested name specifier
   36 |   std::cout << traits<Map<const Foo>>::N << std::endl;
      |                                        ^