使用 mpl::if_ 和整数模板参数选择类型

发布于 2024-12-29 05:30:18 字数 544 浏览 1 评论 0原文

以下代码适用于 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

挖个坑埋了你 2025-01-05 05:30:18

您需要 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 关键字。

请参阅此处的深入解释:我必须在何处以及为何放置模板和类型名称关键字

You need the typename keyword:

typedef typename                   // <-- Here
    boost::mpl::if_<
        boost::mpl::bool_<X == 1>,
        int,
        bool
    >::type Type;

The compiler cannot be sure that mpl::if_<...>::type is a type, since it does not know the value of X: if_ could be specialized for certain parameters and include a type member which is not a type, for instance:

//Silly if_ specialization
template <typename Then, typename Else>
struct if_<void, Then, Else>
{
    int type;
};

Therefore, you need to explicitly tell the compiler that ::type denotes a type, with the typename keyword.

See an in-depth explanation here: Where and why do I have to put the template and typename keywords.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文