以下是MSVC ++ 10 Sp1上的“内部编译器错误”。
关于gcc:
b.cpp:16:12:错误:非命名空间范围'struct A :: B'中的显式特化
b.cpp:16:28:错误:主模板声明中的模板ID'f'
//class template
template< class T>
struct A{
//struct B {}; //Remove the comment and it will compile!
};
//partial specialization
template< class T >
struct A< T* >
{
struct B {
template<class C> void f(){}
//"Internal Compiler Error"
template<> void f<int>(){};
};
};
但是,如果struct B
之前的注释被删除,它将编译!
我不明白这个问题!
答案 0 :(得分:2)
您的代码中存在错误,MSVC ++没有处理它。 gcc编译产生了这个:
$ make parspec.o
g++ -c -o parspec.o parspec.cc
parspec.cc:17: error: explicit specialization in non-namespace scope ‘struct A<T*>::B’
make: *** [parspec.o] Error 1
简而言之,你不能在类或结构中专门化。
编辑:一个快速的谷歌表明,MSVC ++允许这样的不合规结构,但我猜他们并没有做得很好。
答案 1 :(得分:0)
您不能为类模板的多个实例专门化成员函数。这是允许的:
template<typename T>
struct A{
};
template<typename T>
struct A<T*>
{
struct B {
template<class C> void f();
};
};
template<typename T>
template<typename C>
void A<T*>::B::f() {}
template<>
template<>
void A<char*>::B::f<int>() {}
但这不是:
template<typename T>
template<>
void A<T*>::B::f<int>() {}