【问题标题】:structure in template class模板类中的结构
【发布时间】:2009-09-30 19:02:19
【问题描述】:

示例代码如下:

struct TEMP
{
    int j;
    TEMP()
    {
     j = 0;
    }
};

template<typename T>
class classA
{
    struct strA
    {
        long i;
        strA():i(0) {}
    };
    static strA obj_str;
    classA();
};

template<typename T>
classA<T>::classA()
{}

template<typename T> 
classA<TEMP>::strA classA<TEMP>::obj_str;

int main()
{
   return 0;
}

在编译此代码时,我收到以下错误:

test1.cpp:32:内部编译器错误:在 import_export_decl 中,位于 cp/decl2.c:1970 请提交完整的错误报告, 如果合适,使用预处理的源。 有关说明,请参阅 http://bugzilla.redhat.com/bugzilla>。 存储在 /tmp/ccUGE0GW.out 文件中的预处理源,请将其附加到您的错误报告中。

我在x86_64-redhat-linux机器上构建这段代码,gcc版本是gcc version 4.1.2 20070626(Red Hat 4.1.2-14)

请注意,此代码已在 i386-redhat-linux 机器上使用 gcc 版本 3.4.5 20051201 (Red Hat 3.4.5-2) 构建。

知道为什么这不能用 gcc 4.1.2 构建。

提前致谢。

【问题讨论】:

  • 您是否提交了完整的错误报告?这就是错误告诉你要做的事情。您现在可以尝试使用不同的编译器 [版本]。
  • 在这里找到了一个错误报告:gcc.gnu.org/bugzilla/show_bug.cgi?id=24791 - 这看起来像是那个的变种。
  • 内部编译器错误总是意味着编译器有问题,所以不要认为这是你的错。

标签: c++


【解决方案1】:

无论如何,您的代码在以下声明中没有多大意义。

template<typename T> 
classA<TEMP>::strA classA<TEMP>::obj_str;

因为T 参数在声明中没有使用。我认为您要么想写以下内容之一:

// definition of static member of template
template<typename T> 
typename classA<T>::strA classA<T>::obj_str;

// ... or declaration of static member specialization for `T=TEMP` of template
template<> 
classA<TEMP>::strA classA<TEMP>::obj_str;

我怀疑这是第一个。对于编译器崩溃 - 在任何情况下肯定都不应该发生 :)


编辑: 至少在 4.4.1 中已经修复了该错误 - 我认为不再需要报告。

【讨论】:

  • 对,这种bug已经在高版本中报告和修复了。但我在想,如果可以用相同的版本和一些代码更改来构建它。是的,通过上述代码更改,代码被编译。谢谢:)
【解决方案2】:

我会按照错误报告进行操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多