2011-11-08 51 views
0

以下给出MSVC++ 10 Sp1上的“内部编译器错误”。部分和显式模板专门化的奇怪错误

而上的gcc:

b.cpp:16:12:错误:在非命名空间范围显式特 '结构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

这也不应该与删除的评论编译。 –

+0

[模板类中的模板函数的显式特化的C++语法的可能的重复?](http://stackoverflow.com/questions/2097811/c-syntax-for-explicit-specialization-of-a-template-function -in-a-template-clas) –

回答

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++允许这种不符合的构造,但我想他们没有做得很好。

+0

但是,如果所标注的评论被删除,那么它编译的事实呢? –

+0

@ user578832:这是GCC中的一个错误,它不应该编译。 –

+0

@ user578832:或许我的记忆力让我失望,因为我很久没有看过这些东西了,但是最后一次检查时,我确信标准不允许。 –

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