提升enable_if问题

时间:2010-11-01 11:01:24

标签: c++ boost enable-if

这或多或少都是从提升文档中复制粘贴而且我一直收到错误(实际上有很多错误)

我正在尝试确保模板类仅用于使用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:语法错误:缺少';'在'&lt;'之前:第9行 C2059:语法错误:'&lt;' :第9行 C2899:typename不能在模板声明之外使用

Visual Studio 2005 btw。

3 个答案:

答案 0 :(得分:1)

您实际上从未创建过名为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;
};

答案 1 :(得分:1)

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

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

enable_if的{​​{3}}有这个例子,也许就是你想要的:

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> { ... };

干杯&amp;第h。,

答案 2 :(得分:1)

因为你最后错过了::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;
};

眼睛容易多了。