MSVC ++ 2010上的BOOST_STATIC_ASSERT

时间:2011-11-01 22:13:26

标签: c++ visual-studio-2010 visual-c++ boost

我正在使用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替换,但得到类似的构建错误(打印出消息字符串)。

对此存在哪些解决方法?

1 个答案:

答案 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;}