以下代码适用于Visual Studio 2005,但在使用g ++ 4.4.5编译时出现编译器错误:
#include <boost/mpl/if.hpp>
#include <boost/mpl/bool.hpp>
template<int X> struct A
{
void f() {
typedef boost::mpl::if_<boost::mpl::bool_<X == 1>, int, bool>::type Type;
}
};
这是我得到的错误:
main.cpp: In member function ‘void A<X>::f()’:
main.cpp:12: error: too few template-parameter-lists
代码有什么问题?如果我用硬编码的数字替换模板化的X,代码编译就好了。我也尝试用mpl :: int_类型包装X但没有任何成功。
谢谢!
答案 0 :(得分:2)
您需要typename
关键字:
typedef typename // <-- Here
boost::mpl::if_<
boost::mpl::bool_<X == 1>,
int,
bool
>::type Type;
编译器无法确定mpl::if_<...>::type
是否为某种类型,因为它不知道X
的值:if_
可能专门用于某些参数并包含type
}成员不是类型,例如:
//Silly if_ specialization
template <typename Then, typename Else>
struct if_<void, Then, Else>
{
int type;
};
因此,您需要明确告诉编译器::type
表示具有typename
关键字的类型。
请在此处查看详细说明:Where and why do I have to put the template and typename keywords。