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

时间:2011-11-08 21:31:16

标签: c++ visual-studio-2010

以下是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之前的注释被删除,它将编译!

我不明白这个问题!

2 个答案:

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