没有名为'开始'在命名空间' std'

时间:2016-10-05 13:15:01

标签: c++ xcode namespaces std

我在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'会发生?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

std::sort(std::valarray::begin(v), std::valarray::end(v)); - 我不认为标准要求这项工作。我想如果valarray实施beginend作为静态或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(); }
}

并在notstd::begin上使用valarray