2014-12-01 2 views
0
int delta[4][2] = {{0,1},{1,0},{0,-1},{-1,0}}; 
random_shuffle(&delta[0],&delta[4]); 

Compile Error:random_shuffle() работает на окнах, но оленья кожа компиляции на Linux

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algobase.h: In function 'void std::swap(_Tp&, _Tp&) [with _Tp = int [2]]': 
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algobase.h:127: instantiated from 'static void std::__iter_swap<true>::iter_swap(_ForwardIterator1, _ForwardIterator2) [with _ForwardIterator1 = int (*)[2], _ForwardIterator2 = int (*)[2]]' 
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algobase.h:163: instantiated from 'void std::iter_swap(_ForwardIterator1, _ForwardIterator2) [with _ForwardIterator1 = int (*)[2], _ForwardIterator2 = int (*)[2]]' 
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:1906: instantiated from 'void std::random_shuffle(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = int (*)[2]]'main.cpp:150: instantiated from here 
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algobase.h:97: error: array must be initialized with a brace-enclosed initializer 
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algobase.h:98: error: ISO C++ forbids assignment of arrays 
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algobase.h:99: error: ISO C++ forbids assignment of arrays 

же кусок кода компилирует на Windows, г ++.

+2

'random_shuffle' был одобрен для удаления с C++. Не используйте его. – chris

+0

Есть ли альтернативы, которые я могу использовать? –

+0

Да, 'std :: shuffle', если у вас есть поддержка C++ 11. Действительно, GCC 4.1.2 крайне устарел. Вы также пытаетесь перетасовать массивы, которые не будут работать. – chris

ответ

2

std::random_shuffle работает путем замены. Переключение (обычно) требует назначения. Но массивы не назначаются. В C++ 11 существует специализация std::swap для массивов, которая не использует прямое назначение. Поэтому вам нужно включить C++ 11, чтобы ваш код работал. Добавьте опцию компилятора -std=c++11 (если ваша версия gcc поддерживает ее).

Смежные вопросы