Можно создать дубликат:
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
не соответствует требованию быть типом. Я был бы признателен за то, что я делаю неправильно.
Спасибо за указание на это и для связывания другой нити. – nijansen