【发布时间】:2011-11-01 22:13:25
【问题描述】:
我正在使用 boost 1.45.0 并且有一些代码可以执行以下操作:
template <typename T = some_type, std::size_t N = 3> class my_class {
public:
typedef T value_type;
...
...
my_class(value_type i0) {BOOST_STATIC_ASSERT(N==1); m_data[0]=i0;}
protected:
T m_data[N];
//!< The internal data array used to store indices
}
这会在 MS VC++ 2010 上生成以下错误(据我所知,它已将 static_assert 实现为 他们的主要变化之一)并且在 MS VC++ 2008 上没有错误:
error C2338: N==1
同样,在同一代码中的其他一些 BOOST_STATIC_ASSERT 处还有其他错误(为简洁起见)。
我也尝试用 VC++ 中的 static_assert 替换,但得到了类似的构建错误(打印出消息字符串)。
对此有什么解决方法?
【问题讨论】:
-
实例化
func的代码应该触发错误吗? -
好吧,
N不等于 1,那么您期望什么? -
static_assert在条件为 false 时失败,而不是在条件为 true 时失败。也许这就是你的困惑来自哪里?需要明确的是,3==1是错误的,因此它失败了。 -
谢谢@GMan:我明白你的意思;但不知何故,我觉得可能会解决这个问题。 SFINAE 不涵盖这种类型的使用吗?此外,它在 MS VC++ 2008 上构建良好(尽管当时我使用的是 boost 1.39.0)
-
静态断言正在做它应该做的事情。您正在检查 N == 1,但您将其默认值设置为 3。因此,如果出现任何带有默认模板参数的 my_class 实例,它应该触发该断言。你想做什么?
标签: c++ visual-studio-2010 visual-c++ boost