【问题标题】:Internal compiler error : segmentation fault with g++4.3.5内部编译器错误:g++4.3.5 的分段错误
【发布时间】:2012-03-22 08:34:53
【问题描述】:

这里是代码

   //fail_.cpp
   template< unsigned char X, class L>
   class A {
      public:
      typedef void (A::*fptr)();
      class B {   
           public: B(typename A< X, L> ::fptr );
      };
   };
   template < unsigned char X, typename L >
   A<X,L>::B::B ( fptr ) { }

g++ -c fail_.cpp给了

fail_.cpp:11:内部编译器错误:分段错误
请提交完整的错误报告, 如果合适,使用预处理的源。
有关说明,请参阅

在 g++4.3.5 中对我来说似乎是一个错误,g++4.4 及更高版本不会给出任何此类段错误。

你们怎么看?代码本身有问题吗?

【问题讨论】:

  • 内部编译器错误始终是错误。如果代码有问题,编译器应该产生一个实际的错误消息,而不是崩溃。
  • 我觉得不错。我可能会尝试将内部类简化为class B { public: B(fptr); };。 typedef 应该在那里可见。
  • 有趣的是,如果我在定义中写typename A&lt; X, L&gt; ::fptr,它编译得很好:ideone.com/0OOpn
  • 在 c++11 中你不需要 typename 那里。试试这是否能防止错误。
  • @Prasoon:我在 g++ 4.3.2 中遇到了同样的内部错误,似乎它可能会影响整个 4.3 分支。

标签: c++ g++


【解决方案1】:

我在 gcc 4.2 中看到了类似的失败。正如其他人所说,内部错误意味着编译器内部出现严重错误,这暗示这是您的代码错误。

它在 g++ 4.6 和 clang 3.0 中运行良好。

【讨论】:

    【解决方案2】:

    typename 应该用作模板部分中类的替代品。

    在内部类 B 中,传递函数指针不需要关键字 typename,因为此时编译器已经知道 A

    也许在类型前面给出类型名会导致编译器格式错误(可能是未定义的行为?)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-16
      • 2017-11-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 2011-08-26
      • 1970-01-01
      相关资源
      最近更新 更多