2012-05-07 2 views
2

Можно создать дубликат:
Where and why do I have to put the “template” and “typename” keywords?Metafunction для преобразования типа

Я учусь программировать шаблон в книге "C++ Template Метапрограммирование: Концепции, инструменты и методы от повышающего и за его пределами" и как-то я сам застрял в самом первом упражнении.

Задача состоит в том, чтобы написать унарный metafunction add_const_ref<T>, который возвращает T, если он является ссылочным, и в противном случае возвращает T const &.

Мой подход:

template <typename T> 
struct add_const_ref 
{ 
    typedef boost::conditional 
     < 
     boost::is_reference<T>::value, // check if reference 
     T,        // return T if reference 
     boost::add_reference   // return T const & otherwise 
      < 
      boost::add_const<T>::type 
      >::type 
     >::type 
    type; 
}; 

Я пытался проверить его (я использую блок тестирования Google Framework, поэтому синтаксис):

TEST(exercise, ShouldReturnTIfReference) 
{ 
    ASSERT_TRUE(boost::is_same 
     < 
     int &, 
     add_const_ref<int &>::type 
     >::value 
    ); 
} 

Но он не компилируется:

main.cpp:27:5: error: type/value mismatch at argument 1 in template parameter list for ‘template<class T> struct boost::add_reference’ 
main.cpp:27:5: error: expected a type, got ‘boost::add_const<T>::type’ 
main.cpp:28:4: error: template argument 3 is invalid 

Я действительно не понимаю, почему boost::add_const<T>::type не соответствует требованию быть типом. Я был бы признателен за то, что я делаю неправильно.

ответ

1

Вы упускаете много typename S здесь:

template <typename T> 
struct add_const_ref 
{ 
    typedef typename boost::conditional 
    //  ^^^^^^^^ 
     < 
     boost::is_reference<T>::value, // check if reference 
     T,        // return T if reference 
     typename boost::add_reference   // return T const & otherwise 
    // ^^^^^^^^ 
      < 
      typename boost::add_const<T>::type 
    //  ^^^^^^^^ 
      >::type 
     >::type 
    type; 
}; 
+0

Спасибо за указание на это и для связывания другой нити. – nijansen

Смежные вопросы