我在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'
会发生?
答案 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
实施begin
和end
作为静态或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
。