这样的代码可以由GCC编译,但是clang 3.5失败了.
#include <iostream>
using namespace std;
template<typename T>
class C{
public:
const static int x;
};
int main(){
cout << C<int>::x;
}
template<>
const int C<int>::x = 4;
Run Code Online (Sandbox Code Playgroud)
Clang返回消息:
hello.cpp:15:19: error: explicit specialization of 'x' after instantiation
const int C<int>::x = 4;
^
hello.cpp:11:19: note: implicit instantiation first required here
cout << C<int>::x;
^
Run Code Online (Sandbox Code Playgroud)
是代码中的错误还是clang编译器中的错误?它是否符合标准,或GCC是否更宽松并编译非标准代码?
程序错误。C++11 14.7.3/6 说:
如果模板 [...] 是显式专门化的,则应在第一次使用该专门化之前声明该专门化,这将导致发生隐式实例化
您的代码在 中使用它main,导致在那里进行隐式实例化,然后稍后声明专业化,如错误消息所述。