【问题标题】:Strange Error with Partial and explicit template specialization部分和显式模板专业化的奇怪错误
【发布时间】:2011-11-08 21:31:15
【问题描述】:

以下给出了 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 之前的 cmets 被删除,它将编译!

我不明白这个问题!

【问题讨论】:

  • 首先,它不应该编译。你应该提交一份错误报告。这里没有问题,我们无法解释我们没有来源的代码中的错误。
  • 这也不应该在删除注释的情况下编译。
  • @Alexandre C. 如果我知道这是一个错误,我会提交一个错误。但是使用 C++ 有时会变得非常棘手
  • @user578832:内部编译器错误总是是一个错误。

标签: c++ visual-studio-2010


【解决方案1】:

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

简而言之,您不能在类或结构中进行专门化。

编辑:快速搜索一下 Google 表明 MSVC++ 允许这种不符合标准的结构,但我猜他们在这方面做得不是很好。

【讨论】:

  • 但是如果指定的注释被删除,它编译的事实又如何呢?
  • @user578832:这是 GCC 中的一个错误,它不应该编译。
  • @user578832: 可能是我记性不好,因为我很久没看这些东西了,但上次我检查时,我很确定标准不允许它。
  • @MooingDuck:你的意思是说这是 MSVC++ 中的错误吗?
  • @MarceloCantos:更清楚地说,两者都有一个允许它编译的错误,以及 MSVC 中的一个错误,有时会导致编译器崩溃。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多