Demangling和<sstream>导致“对__gnu_gxx命名空间的模糊引用”</sstream>

时间:2013-09-04 07:03:58

标签: c++ gcc c++11 template-meta-programming demangler

当我需要在运行时打印类型信息时,我总是将demangling应用于std::type_info::name()结果。这是GCC的实现,它使用abi::__cxa_demangle()

#include <cxxabi.h>

GCC demangling implementation
std::string demangle(  const std::string& name )
{ 
    int status;

    return std::string( abi::__cxa_demangle( name.c_str() , 0 , 0 , &status ) );

    return name;
}

今天我正在写一个to_string模板,它允许我打印一个类型列表的内容。因此,为了避免std::string个连接,我使用了字符串流std::ostringstream

template<typename T>
struct to_string_t
{
    operator std::string()
    {
        return demangle( typeid( T ).name() );
    }
};

template<typename... Ts>
struct to_string_t<mpl::list<Ts...>>
{
    operator std::string()
    {
        std::ostringstream os;

        os << '[' << _to_string<mpl::list<Ts...>>() << ']';

        return os.str();
    }
};

_to_string是一个类模板,它实现operator<<以递归方式将类型列表的内容打印到流中。 (我不包括它以免膨胀与非相关元编程代码的帖子)

完全无需解码。当我包含<cxxabi>来实现demangling时,编译器会在ambiguous reference to __gnu_gxx namespace中显示sstream.h错误。

可能是什么原因?

0 个答案:

没有答案