部分和显式模板专门化的奇怪错误
Strange Error with Partial and explicit template specialization
下面给出了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>() {}
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- 线程 std::调用未知类型,无法专门化函数错误
- 错误 C2893 无法专门化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...)'
- 如果模板的错误代码在If(false)中,我必须专门化模板吗
- 错误:T没有命名类型-用于使用强类型枚举的专门化
- 显式函数模板专门化选择了错误的专门化
- 下面的模板专门化代码是非标准的,或者是vs - c++中的错误
- 为类的trait专门化实现错误消息
- 当试图用另一个类模板部分专门化一个类模板时,在VS2013中出现错误
- 部分和显式模板专门化的奇怪错误
- 防止模板部分专门化错误
- 模板专门化GCC的语法错误,但MSVC没有
- 在cpp文件中实现模板专门化导致Template -id does not match错误
- 模板专门化语法错误?不确定
- 私有类专门化错误
- 一个模板专门化用于pod,一个模板专门化用于类层次结构,在其他情况下出现错误
- GCC错误:在非命名空间范围内显式专门化
- 模板方法专门化链接错误