部分和显式模板专门化的奇怪错误



下面给出了msvc++ 10 Sp1上的"内部编译错误"。

b.cp:16:12:错误:在非命名空间作用域中显式特化' struct A::B '

b.p p:16:28: error: template-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之前的注释,它将编译!

我不明白这个问题!

您的代码中有一个错误,而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

简而言之,你不能专门化一个类或结构。

EDIT:快速搜索一下,msvc++允许这种不符合标准的结构,但我猜他们在这方面做得不是很好

不能为类模板的多个实例专门化成员函数。这是允许的:

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

最新更新