使用 mpl::if_ 和整数模板参数选择类型
以下代码适用于 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 但没有成功。
谢谢!
The following code works on Visual Studio 2005, but gives me a compiler error when compiled with 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;
}
};
This is the error I get:
main.cpp: In member function ‘void A<X>::f()’:
main.cpp:12: error: too few template-parameter-lists
What's wrong with the code? If I replace the templated X with a hard coded number, the code compiles just fine. I've also tried wrapping X with a mpl::int_ type but without any success.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您需要
typename
关键字:编译器无法确定
mpl::if_<...>::type
是类型,因为它不知道值X
的:if_
可以专门用于某些参数,并包含一个不是类型的type
成员,例如:因此,您需要显式告诉编译器
::type
表示类型,使用typename
关键字。请参阅此处的深入解释:我必须在何处以及为何放置模板和类型名称关键字。
You need the
typename
keyword:The compiler cannot be sure that
mpl::if_<...>::type
is a type, since it does not know the value ofX
:if_
could be specialized for certain parameters and include atype
member which is not a type, for instance:Therefore, you need to explicitly tell the compiler that
::type
denotes a type, with thetypename
keyword.See an in-depth explanation here: Where and why do I have to put the template and typename keywords.