Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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++ 双模板<&燃气轮机;在模板专门化中_C++_Templates - Fatal编程技术网

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()
{

}