0

プラットフォーム: 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 型を認識できないようです。「ordinary int」の配列で同様のステートメントを使用しましたが、うまく機能します。ターゲット配列のサイズを正確に知っているため、STL コンテナーを使用していないため、back_inserter のようなものを再実装する必要はないと思います。私は何かを逃しましたか?

注:このような質問が役立つかどうかはわかりません。(または、ステートメントが typedef された変数で機能するように、「完全な」修飾名を取得するにはどうすればよいですか?)

4

1 に答える 1

6

あなたはおそらく次のことを意味していました:

std::copy(&a.myArray[0], &a.myArray[10], &b.myArray[0]);

また

std::copy(a.myArray, a.myArray + 10, b.myArray);

a.myArray[0]は単なる であり、必要とする配列longのポインタではありません。また、出力パラメーターの型は、コピーされるオブジェクトの型と互換性がある必要があります。には typeがありますが、 type のパラメーターを指定する必要があります。longstd::copy&b.myArraylong (*)[10]long*

于 2013-02-26T08:31:00.380 に答える