0

这或多或少是从 boost docs 粘贴的副本,我不断收到错误(实际上有很多错误)

我试图确保模板类仅与使用 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。

4

3 回答 3

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;
};
于 2010-11-01T11:09:45.193 回答
1

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

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

Boost 文档enable_if这个例子,这可能是你想要的:

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

干杯&hth.,

于 2010-11-01T11:18:17.643 回答
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;
};

它对眼睛更容易。

于 2012-02-09T23:08:13.453 回答