2

以下代码适用于 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 但没有任何成功。

谢谢!

4

1 回答 1

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

在这里查看深入的解释:我必须在哪里以及为什么要放置模板和类型名关键字

于 2012-01-26T10:36:38.080 回答