typename дает странный результат — в codeblocks

#c #gcc #c 11

#c #gcc #c 11

Вопрос:

Этот код из main:

 Int<> a;
    cout << typeid(Int<>::range_type).name();  
  

выдает вывод ‘x’ при компиляции в codeblocks с gcc 4.6.1. Есть ли причина для этого?

 template<class Int_T>
struct Best_Fit
{//evaluate it lazily ;)
    typedef typename if_<std::is_signed<Int_T>::value,Signed_Type,Unsigned_Type>::type type;
};

template<class Int_T = int, typename Best_Fit<Int_T>::type Min_Range = std::numeric_limits<Int_T>::min(), typename Best_Fit<Int_T>::type Max_Range = std::numeric_limits<Int_T>::max()>
class Int {
    public:
    typedef decltype(Min_Range) range_type;
};
  

Комментарии:

1. Я добавил C 11, потому что вы используете функции C 11 ( constexpr , decltype ).

Ответ №1:

typename Best_Fit<Int_T>::type при создании экземпляра вы получите результат Signed_Type . Поскольку вы не показываете его определение, мы понятия не имеем, что это за тип. Но c filt -t x говорит, что это так long long .

Напомним, что typeid(...).name() это может дать любое имя, которое он хочет. GNU libstdc выдает искаженное имя типа.

Комментарии:

1. @litb где я могу узнать, как использовать c filt? Пробовал Google, но без особого успеха.