Платформа: MinGW64 (rubenvb 4.7.2), Windows 7 (64), Qt 4.8.2
Данный сегмент кода следующим образом:
/* type definition */
typedef long T_PSIZE;
struct A { T_PSIZE myArray[10]; };
struct B { T_PSIZE myArray[10]; };
/* declare variable */
A a;
B b;
std::copy(a.myArray[0], a.myArray[10], &b.myArray);
Я не знаю, почему компилятор выдает следующие сообщения об ошибках (аналогичные сообщения также отображаются при изменении с ‘typedef long T_PSIZE;’ на ‘typedef int T_PSIZE;’):
> c:\mingw\rubenvb-4.7.2-64\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2/bits/stl_algobase.h:
> In instantiation of '_OI std::__copy_move_a(_II, _II, _OI) [with bool
> _IsMove = false; _II = long int; _OI = long int (*)[9]]': c:\mingw\rubenvb-4.7.2-64\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2/bits/stl_algobase.h:422:39:
> required from '_OI std::__copy_move_a2(_II, _II, _OI) [with bool
> _IsMove = false; _II = long int; _OI = long int (*)[9]]' c:\mingw\rubenvb-4.7.2-64\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2/bits/stl_algobase.h:454:18:
> required from '_OI std::copy(_II, _II, _OI) [with _II = long int; _OI
> = long int (*)[9]]' ..\InfluSimHKPrototype\SimApplication.cpp:114:36: required from here
> c:\mingw\rubenvb-4.7.2-64\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2/bits/stl_algobase.h:375:57:
> error: no type named 'value_type' in 'struct std::iterator_traits<long
> int>'
> c:\mingw\rubenvb-4.7.2-64\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2/bits/stl_algobase.h:377:64:
> error: no type named 'iterator_category' in 'struct
> std::iterator_traits<long int>'
> c:\mingw\rubenvb-4.7.2-64\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2/bits/stl_algobase.h:381:57:
> error: no type named 'value_type' in 'struct std::iterator_traits<long
> int>'
> c:\mingw\rubenvb-4.7.2-64\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2/bits/stl_algobase.h:384:70:
> error: no type named 'iterator_category' in 'struct
> std::iterator_traits<long int>'
Кажется, что тип ‘long int’ не может быть распознан механизмом шаблонов компилятора. Я использовал аналогичное утверждение с массивом ‘normal int’, и оно прекрасно работает. Я не использую какие-либо контейнеры STL, так как точно знаю размер целевого массива, поэтому я не думаю, что мне нужно заново реализовывать что-то вроде back_inserter. Я что-то пропустил?
Заметка: Я не уверен, если вопрос как это Помогите. (Или как я могу получить полное имя для оператора, работающего с переменными typedef?)
Вы, вероятно, имели в виду:
std::copy(&a.myArray[0], &a.myArray[10], &b.myArray[0]);
или же
std::copy(a.myArray, a.myArray + 10, b.myArray);
a.myArray[0]
это просто long
, а не указатель в массив long
который std::copy
требует. Кроме того, тип выходного параметра должен быть совместим с типом копируемого объекта. &b.myArray
имеет тип long (*)[10]
тогда как вам нужно указать параметр типа long*
,
Других решений пока нет …