可能重复:
Where and why do I have to put the “template” and “typename” keywords?
我正在通过“C ++模板元编程:Boost and Beyond中的概念,工具和技术”这本书学习模板编程,不知怎的,我在第一次练习时陷入困境。
任务是编写一个一元函数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 Unit Testing 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
不符合作为类型的要求。我希望能够暗示我做错了什么。
答案 0 :(得分:1)
你在这里错过了很多typename
:
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;
};