#include
#include
#include
// Example allocator, doesn't do anything but implements std::allocator_traits
template
struct null_allocator {
using value_type = T;
using size_type = std::size_t;
using pointer = T *;
using const_pointer = const pointer;
//using difference_type = typename std::pointer_traits
::difference_type;
using reference = T &;
using const_reference = const T &;
null_allocator() {}
template
null_allocator(const null_allocator&) {}
T* allocate(std::size_t size) {
(void) size;
return nullptr;
}
void deallocate(T* ptr, std::size_t size) {
(void) ptr;
(void) size;
}
template
struct rebind
{
typedef null_allocator other;
};
};
int main(int argc, char** argv) {
std::vector vec;
void * args;
vec.push_back(args);
vec.erase(vec.begin());
}
< /code>
gcc.godbolt.org показывает, что он компилизируется с Clang < /p>
Я передаю пользовательский распределитель на std :: вектор, нажмите на один объект на вектор и пытаюсь вызвать Std :: Erase на этот вектор. Пользовательский распределитель - это нулевый распределитель, который ничего не делает и не имеет значения. Дело в том, что этот фрагмент складывает в Linux как с GCC, так и с Clang, но не может компилировать на OSX с Xcode/Apple Clang. std :: iterator_traits: < /p>
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:604:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iterator:1120:54: error: no type named 'iterator_category' in
'std::__1::iterator_traits'
typedef typename iterator_traits::iterator_category iterator_category;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
bug.cpp:42:13: note: in instantiation of template class 'std::__1::__wrap_iter' requested here
vec.erase(vec.begin());
^
In file included from bug.cpp:1:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:604:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iterator:1121:54: error: no type named 'value_type' in
'std::__1::iterator_traits'
typedef typename iterator_traits::value_type value_type;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iterator:1122:54: error: no type named 'difference_type' in
'std::__1::iterator_traits'
typedef typename iterator_traits::difference_type difference_type;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iterator:1123:54: error: no type named 'pointer' in
'std::__1::iterator_traits'
typedef typename iterator_traits::pointer pointer;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iterator:1124:54: error: no type named 'reference' in
'std::__1::iterator_traits'
typedef typename iterator_traits::reference reference;
Кто -нибудь знает хороший обходной путь для этой проблемы?
У меня есть следующий фрагмент кода: < /p> [code]#include #include #include
// Example allocator, doesn't do anything but implements std::allocator_traits template struct null_allocator { using value_type = T; using size_type = std::size_t; using pointer = T *; using const_pointer = const pointer; //using difference_type = typename std::pointer_traits ::difference_type; using reference = T &; using const_reference = const T &;
int main(int argc, char** argv) { std::vector vec;
void * args; vec.push_back(args); vec.erase(vec.begin()); } < /code> gcc.godbolt.org показывает, что он компилизируется с Clang < /p> Я передаю пользовательский распределитель на std :: вектор, нажмите на один объект на вектор и пытаюсь вызвать Std :: Erase на этот вектор. Пользовательский распределитель - это нулевый распределитель, который ничего не делает и не имеет значения. Дело в том, что этот фрагмент складывает в Linux как с GCC, так и с Clang, но не может компилировать на OSX с Xcode/Apple Clang. std :: iterator_traits: < /p> In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:604: /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iterator:1120:54: error: no type named 'iterator_category' in 'std::__1::iterator_traits' typedef typename iterator_traits::iterator_category iterator_category; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ bug.cpp:42:13: note: in instantiation of template class 'std::__1::__wrap_iter' requested here vec.erase(vec.begin()); ^ In file included from bug.cpp:1: In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:604: /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iterator:1121:54: error: no type named 'value_type' in 'std::__1::iterator_traits' typedef typename iterator_traits::value_type value_type; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~ /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iterator:1122:54: error: no type named 'difference_type' in 'std::__1::iterator_traits' typedef typename iterator_traits::difference_type difference_type; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~ /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iterator:1123:54: error: no type named 'pointer' in 'std::__1::iterator_traits' typedef typename iterator_traits::pointer pointer; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~ /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iterator:1124:54: error: no type named 'reference' in 'std::__1::iterator_traits' typedef typename iterator_traits::reference reference; [/code] Кто -нибудь знает хороший обходной путь для этой проблемы?