C++;模板参数和部分专门化:强类型还是弱类型? 今天,我和我的一个朋友在一个愚蠢的错误上做了很多努力,我想知道模板参数是如何在C++中工作的。考虑下面的代码,在这里我尝试专门化一个类 ADT/其中 i 是未签名的int < />代码>,虽然 MyClass 期望 int 参数: #包括 模板 类MyClass { }; 模板 结构属性; 模板 结构属性 { }; int main(int argc,char*argv[]) { attr att; 返回0; }

C++;模板参数和部分专门化:强类型还是弱类型? 今天,我和我的一个朋友在一个愚蠢的错误上做了很多努力,我想知道模板参数是如何在C++中工作的。考虑下面的代码,在这里我尝试专门化一个类 ADT/其中 i 是未签名的int < />代码>,虽然 MyClass 期望 int 参数: #包括 模板 类MyClass { }; 模板 结构属性; 模板 结构属性 { }; int main(int argc,char*argv[]) { attr att; 返回0; },c++,templates,c++14,typing,C++,Templates,C++14,Typing,g++失败并显示错误消息 main.cpp: In function ‘int main(int, char**)’: main.cpp:20:22: erreur : aggregate ‘attr<MyClass<1> > att’ has incomplete type and cannot be defined attr<MyClass<1>> att; main.cpp:在函数“int main(int,char**)”中:

g++
失败并显示错误消息

main.cpp: In function ‘int main(int, char**)’:
main.cpp:20:22: erreur : aggregate ‘attr<MyClass<1> > att’ has incomplete type and cannot be defined
     attr<MyClass<1>> att;
main.cpp:在函数“int main(int,char**)”中:
main.cpp:20:22:erreur:聚合“attr att”的类型不完整,无法定义
attr att;
并且
clang
编译它(由于
att
未使用,因此仅发出警告)

所以我想知道:

  • 规范中是否有任何规定对其中一个有利

  • 我们可以说
    clang
    模板参数的类型比
    g++
    弱吗


是的,至少根据当前标准,GCC拒绝是正确的。我不知道,可能是Clang的人在这里实现了一些缺陷报告

如果p有一个包含
的表单,并且如果a的对应值的类型不同于i的类型,则扣减失败。如果P有一个包含
[i]
的表单,并且如果i的类型不是整数类型,则演绎失败

他们的testsuite中的testcase仅对函数进行测试,对于这些函数,它们似乎会发出合理的错误消息:

此外,由于部分专门化永远无法推导,我们还遇到了一个问题,即这样的构造是否应该提前被拒绝。我认为,如果您愿意,可以应用:

知道哪些名称是类型名称可以检查每个模板的语法。程序格式不正确,不需要诊断,如果:

  • 无法为模板生成有效的专门化,并且该模板未实例化,或者…”
没有合法的方法来触发该模板的实例化,因此您可能会认为无法为其生成有效的专门化。根据这种解释,行为是不明确的,任何事情都是合法的