我正在使用 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 替换,但得到了类似的构建错误(打印出消息字符串)。
有什么解决方法?
最佳答案
我认为您可能误解了静态断言的目的。静态断言旨在声明必须为真才能让代码编译的属性。如果你想要编写一个函数,除非某些条件为真但不会编译失败,否则不会生成,你需要使用 SFINAE .
// don't forget to #include <type_traits> for std::enable_if
template <std::size_t N1 = N>
my_class(value_type i0, typename std::enable_if<N1==1>::type* = 0)
{m_data[0]=i0;}
关于c++ - 在 MSVC 2010 上 boost STATIC_ASSERT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7973579/