【问题标题】:BOOST_STATIC_ASSERT on MSVC++ 2010MSVC 2010 上的 BOOST STATIC_ASSERT
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • @Fernandes .. 你可能正在做某事。让我试试这个,然后回来陪你。我认为你成功了。
  • @Fernandes,我试过了,但现在我得到了一个构建错误:错误 C2039: 'type' : is not a member of 'std::tr1::enable_if<_test>'跨度>
  • @user545591 :如果 N != 1 并且您没有替代的构造函数重载可以调用,就会发生这种情况。即,如果条件为假,整个目的是使包含 enable_if 的重载在重载解析期间不合格,因此您需要在这种情况下调用其他重载。
  • 哦,对了,我忘了一件事。似乎您需要将构造函数作为模板才能使其正常工作。我会编辑。
  • @R.MartinhoFernandes :他使用的是 VC++ 2010,它不支持默认函数模板参数,因此您的代码原样无法工作。
猜你喜欢
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 2013-04-12
相关资源
最近更新 更多