虽然包含<typeinfo> </typeinfo>,但Clang拒绝type_info为不完整

时间:2013-02-26 20:01:21

标签: c++ c++11 clang libstdc++

我很遗憾为什么Clang拒绝以下代码:

#include <typeinfo>
#include <exception>

const char* get_name( const std::exception_ptr eptr )
{
  return eptr.__cxa_exception_type()->name();
}

int main() {}

GCC没问题,但Clang抱怨type_info是一个不完整的类型:

$ g++-4.7 -std=c++0x -O3 -Wall -Wextra t.cc -o t
$ clang++-3.2 -std=c++0x -O3 -Wall -Wextra t.cc -o t
t.cc:6:37: error: member access into incomplete type 'const class type_info'
  return eptr.__cxa_exception_type()->name();
                                    ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/exception_ptr.h:144:19: note: forward declaration of
      'std::__exception_ptr::type_info'
      const class type_info*
                  ^
1 error generated.
$ 

问题:如何使用Clang修复它?或者我错过了什么,Clang拒绝代码是正确的吗?

1 个答案:

答案 0 :(得分:5)

感谢@ HowardHinnant的评论,我设法解决了这个问题。问题在预处理器输出中变得明显:libstdc ++在{em>声明 <exception>之前包括来自<type_info>的{​​{1}}。这使得Clang假设了一个新的前瞻性声明std::type_info。解决方案非常简单:

std::__exception_ptr::type_info

好像我应该检查libstdc ++是否已经有错误报告,如果没有,请创建一个。

更新:现在针对GCC 4.7.3 +

修复了错误#56468