繁体   English   中英

提升enable_if问题

[英]Boost enable_if problem

这或多或少是从boost文档粘贴的副本,并且我不断收到错误消息(实际上有很多错误)

我试图确保模板类仅与使用boost的数字一起使用。 这是一个增强的练习,而不是使模板类仅使用数字。

#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_arithmetic.hpp>

using namespace boost;

template <class T>
class A<T, typename enable_if<is_arithmetic<T> >::type> // <-- this is line 9
{
    int foo;
};

int main() {

    return 0;
}

前几个错误C2143:语法错误:缺少';' '<'之前:第9行C2059:语法错误:'<':第9行C2899:类型名不能在模板声明之外使用

Visual Studio 2005顺便说一句。

您实际上从未创建过一个称为A的类模板。 您刚刚创建了一个专业化 您需要首先使用伪参数创建A类模板,以使启动器起作用。

using namespace boost;

template <class T, class Enable = void>
class A { };

template <class T>
class A<T, typename enable_if<is_arithmetic<T> >::type> 
{
    int foo;
};

在专门化A类模板之前,您至少必须声明它。

解决方案取决于您要实现的目标,因为您寻求帮助的问题是针对某些问题的尝试解决方案。

enable_ifBoost文档包含以下示例,也许就是您想要的示例:

template <class T, class Enable = void> 
class A { ... };

template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };

template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };

干杯,……

这是因为您最后缺少::type Enable_if构造有时可能容易出错。 我使用这个小宏使其变得更容易:

#define CLASS_REQUIRES(...) typename boost::enable_if<boost::mpl::and_<__VA_ARGS__, boost::mpl::bool_<true> > >::type

然后,您可以像上面这样编写上面的代码:

template <class T, class Enable = CLASS_REQUIRES(is_arithmetic<T>)>
class A 
{
    int foo;
};

它在眼睛上容易得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM