我正在使用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替换,但得到类似的构建错误(打印出消息字符串)。
对此存在哪些解决方法?
答案 0 :(得分:2)
我认为你可能误解了静态断言的目的。静态断言旨在声明必须为要编译的代码为真的属性。如果你想要的是编写一个不会生成的函数,除非某些条件为真但没有编译失败,你需要使用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;}