C++ 双模板<&燃气轮机;在模板专门化中
下面的代码为什么要编译?我没有专门化模板类的模板成员函数,因此只能使用一个C++ 双模板<&燃气轮机;在模板专门化中,c++,templates,C++,Templates,下面的代码为什么要编译?我没有专门化模板类的模板成员函数,因此只能使用一个template。但是,g++编译它时没有任何警告,而clang++只给出一个警告 警告:模板中的无关模板参数列表 专业化 模板 结构S{}; 模板模板//为什么我们可以这样做? 结构S{}; int main() { } 因为语法允许它,而模板专门化部分似乎没有禁止它的内容: 来自[克温度] 明确专业化: 模板声明 来自[克dcl] 声明: [……] 显性专业化 语法过于松散的事实自2001年以来一直存在于(#293)中
template
。但是,g++编译它时没有任何警告,而clang++只给出一个警告
警告:模板中的无关模板参数列表
专业化
模板
结构S{};
模板模板//为什么我们可以这样做?
结构S{};
int main()
{
}
因为语法允许它,而模板专门化部分似乎没有禁止它的内容:
来自[克温度]
明确专业化:
模板<>
声明
来自[克dcl]
声明:
[……]
显性专业化
语法过于松散的事实自2001年以来一直存在于(#293)中。一份来自更旧版本的clang的bug报告(存档为)也讨论了这个问题。问题在于,在显式专门化过程中,当涉及到多个模板声明是否有效时,gcc和clang都存在差异。引述:
第一个错误实际上是无,clang正确地诊断出只需要一个“模板”
”。但是,由于g++接受这一点,并且一些人(比如我)可能会误解“模板
”的数量是由嵌套控制的,而不是由被专门化的级别数量控制的,因此将错误减少为警告并可能发出修复提示可能会很有趣
这种差异也可能是由标准对明确规范化的循环定义造成的(如所述) 可能是相关的()。@0x499602D2谢谢,尽管报告的错误更有意义,因为有两个级别(尽管只有一个专门化)。@0x499602D2:相关吗?对我来说,这似乎是一个答案;)
template<typename T>
struct S{};
template<> template<> // why can we do this?
struct S<int>{};
int main()
{
}