Demangling и <sstream> приводят к "неоднозначной ссылке на пространство имен __gnu_gxx"

Когда мне нужно напечатать информацию о типе во время выполнения, я всегда применяю 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> чтобы реализовать деминглинг, компилятор показывает ambiguous reference to __gnu_gxx namespace ошибка в sstream.h,

Что может быть причиной?

0 ответов

Другие вопросы по тегам