c++ - 在 MSVC 2010 上 boost STATIC_ASSERT

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

有什么解决方法?

最佳答案

我认为您可能误解了静态断言的目的。静态断言旨在声明必须为真才能让代码编译的属性。如果你想要编写一个函数,除非某些条件为真但不会编译失败,否则不会生成,你需要使用 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/

相关文章:

c++ - 隐式生成的初始化列表构造函数

c++ - archive_read_support_filter_all() 有什么作用?

c# - 为什么网络用户通过 NTLM 进行身份验证?

c# - Visual Studio 2010 不会自动缩进行

c++ - 模板中的第二个lambda函数导致编译错误(智能感知无法检测到问题)-错误C2988

c++编译器忽略第一个if语句

C++ 链接失败, undefined reference

c++ - 使用 SQlite 在 QT5 上关闭和打开数据库时出错

visual-studio-2010 - 退格在 Visual Studio 中不起作用

c++ - 使用带有来自计时器的实时数据的 Direct2D 绘图