我在Linux上使用ICC 14.0.2.此代码段与GCC和CLang编译,但不编译ICC:
template<int N, bool B>
struct A;
template<int N>
struct A<N,false>
{
template<int M>
struct Nested {};
};
template<int N>
struct A<N,true> : public A<N,false> {};
template struct A<1,true>::Nested<2>; // explicit instantiation
Run Code Online (Sandbox Code Playgroud)
尝试用三个编译器编译它:
$ g++ -c -std=c++11 testcase.cc
$ clang++ -c -std=c++11 testcase.cc
$ icpc -c -std=c++11 testcase.cc
testcase.cc(17): error: invalid qualifier for "A<1, false>::Nested<2>" (a derived class is not allowed here)
template struct A<1,true>::Nested<2>;
^
compilation aborted for testcase.cc (code 2)
Run Code Online (Sandbox Code Playgroud)
我找不到有关此错误消息的任何有用信息.
在我的例子中,显式实例化(更复杂的类)是单元测试的一部分,我可以通过实例化一个对象来解决问题,ICC愉快地编译:
void foo()
{
A<1,true>::Nested<2>();
} …Run Code Online (Sandbox Code Playgroud)