【问题标题】:No member named 'begin' in namespace 'std'命名空间“std”中没有名为“begin”的成员
【发布时间】:2017-02-13 23:01:38
【问题描述】:

我在 Windows 上成功编译了一个应该是跨平台的代码。现在,当使用 Mac OS X 在 Xcode 中编译它时,我得到:

std::valarray<float> v(32);
...
std::sort(begin(v), end(v));            # Use of undeclared identifier 'begin'
std::sort(std::begin(v), std::end(v));  # No member named 'begin' in namespace 'std'
std::sort(std::valarray::begin(v), std::valarray::end(v));  # Idem, error as well

为什么会出现错误No member named 'begin' in namespace 'std'

【问题讨论】:

  • 非成员 begin 是 C++11 功能,请尝试在 XCode 中启用它。
  • @Basj:刚刚在测试时看到了这一点:) 我确认将 -std=c++11 添加到命令行中可以正常编译。我很高兴我没有未经测试就回答过:)
  • 什么时候 std=c++11 会成为默认值?快到 2016 年了,有很多问题只有通过添加那个开关才能解决!
  • @Jean-FrançoisFabre 我认为这是一些旧的 XCode 版本?我的意思是,不包含 C++11 对用户不友好,而且这是在 Mac 上,从公理上讲,它是用户友好的。呵呵。
  • 仅供其他人查找,这是地图的另一种可能性。如果您的地图是数据成员,并且您尝试在限定为 const 的非静态类方法中访问它,那么访问 mymap[x] 将导致编译时错误,因为 mymap[x] 将如果 x 已经不存在,则为 x 创建一个条目,因此它正在修改标记为 const 的函数中的数据成员,因此违规。使用 mymap.at(x),如果你知道 x 已经存在于 mymap 中,使用 map.find(x)

标签: c++ xcode namespaces std


【解决方案1】:

您可以在 C++03 模式下编译。了解如何让您的 IDE 在 C++11 模式下编译。 XCode 4.2 turn on C++11 可能会有所帮助。

std::sort(std::valarray::begin(v), std::valarray::end(v)); -- 我不认为标准要求这个工作。我猜如果 valarraybeginend 实现为静态或 Koenig 朋友运算符或类似的。

std::valarray 不附带成员开始/结束。在 C++03 中迭代它的唯一方法是使用 [] 或使用指针。

valarray is guaranteed to be contiguous.。所以你可以写

namespace notstd {
  // addressof taken from http://en.cppreference.com/w/cpp/memory/addressof
  template<class T>
  T* addressof(T& arg) {
    return reinterpret_cast<T*>(
           &const_cast<char&>(
              reinterpret_cast<const volatile char&>(arg)));
  }

  template<class T>
  T* begin( std::valarray<T>& v ) { return addressof(v[0]); }
  template<class T>
  T* end( std::valarray<T>& v ) { return begin(v)+v.size(); }
  template<class T>
  T const* begin( std::valarray<T> const& v ) { return addressof(v[0]); }
  template<class T>
  T const* end( std::valarray<T> const& v ) { return begin(v)+v.size(); }
}

并在您的valarray 上使用notstd::begin

【讨论】:

  • beginend 保证在:、、。还有
  • @NathanOliver: ... 和 这是这里感兴趣的一个!
  • @MartinBonner 那是因为valarray 没有beginend 成员函数。包含它会很愚蠢,因为您无法使用它。从外观上看,任何包含 begin/end 的标准标头都包含 begin/end,这是合理的做法。
  • 谢谢@Yakk。在这种情况下,这段代码(带有 adressof...)比用 &amp;v[0] 替换 begin 更好?
  • 真正的胜利在于end 的定义(实际上几乎不需要addressof - 对于必须使用任意类型的库代码的作者来说更重要)。
【解决方案2】:

std::begin 是在 C++11 中引入的。如何在 XCode 4.2 中启用 C++11,请参阅 this answer(方言的确切名称现在可能已经更改)。

或者,如果您无法迁移到 C++11,请切换到 std::vector 并使用 v.begin()

【讨论】:

  • 谢谢。关于您的替代解决方案,我得到v.begin()No member named 'begin' in 'std::valarray&lt;float&gt;'
  • @Basj:是的。对此感到抱歉 - 我在上面看到了您的评论并更新了我的替代方案。
  • 即使 OP 有 C++11 valarray 也没有 begin 和 end 成员函数。
  • @NathanOliver:是的——这就是为什么我建议在他无法让begin(v) 工作时切换到矢量并使用 v.begin。
  • @NathanOliver:继您对已删除帖子的评论之后: 被定义为为valarrays 提供std::begin 的重载。
猜你喜欢
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 2013-06-09
相关资源
最近更新 更多