0

Qt SDK 4.7.4 for Desktop - MinGW 4.4 で次のコードをコンパイルしようとすると、次のコンパイラ エラーが発生します。

#include <QtCore/QCoreApplication>
#include <QMap>
struct Buffer
{
   char data[4];
};
// A Bucket needs to reserve 16 chars worth of Buffers
typedef Buffer Bucket[(16 * (sizeof (char))) / (sizeof (Buffer))];
typedef QMap<QString, Bucket *> BucketMap;
int main(int argc, char *argv[])
{
   BucketMap bucket;
   bucket.insert(QString("foo"), new Bucket()); //compile error
   return 0;
}
../test/main.cpp: In function 'int main(int, char**)':
../test/main.cpp:13: error: no matching function for call to 'QMap<QString, Buffer (*)[4]>::insert(QString, Buffer*)'
../../../QtSDK/Desktop/Qt/4.7.4/mingw/include/QtCore/qmap.h:556: note: candidates are: QMap<Key, T>::iterator QMap<Key, T>::insert(const Key&, const T&) [with Key = QString, T = Buffer (*)[4]]
mingw32-make.exe[1]: *** [debug/main.o] Error 1
mingw32-make.exe: *** [debug] Error 2

std::stringこれをとを使用して同等の例に変換しstd::mapて、同じ効果を得ようとしました。Qt バージョンを提示したのは、それがよりコンパクトであり、最終的に私のプロジェクトが必要とする形式であるためです。が最終的に
どのように解釈されるかについて、何かが欠けているだけだと思います。typedef2 番目の引数がinsertどうやらBuffer *(not Buffer(*)[4]) になっているのはなぜですか?どうすれば修正できますか?

4

2 に答える 2

2

簡単な答え: タイプが一致しません。

実際に知っておくべきこと:new配列型の式を呼び出すことはできません。したがって、次の 2 つは同等ではありません (最初の 1 つ目は正しくありません)。

typedef T TArr[4]; TArr * p = new TArr;  // #1

T * q = new T[4];                        // #2

言語はそのようには機能しません。2 番目のバージョンは動的配列を作成しますが、最初のバージョンは「4 T の配列」タイプの単一の動的オブジェクトを作成しようとしますが、これは不可能です。代わりに、new TArr実際には と同じであるため、結果は4 つの s.* のnew T[4]動的配列になります。T

基本的に、マップの値の型を または または または のどちらか好きな方に変更する必要Buffer *std::array<Buffer, 4> *ありstd::unique_ptr<Buffer[]>ますstd::unique_ptr<std::array<Buffer, 4>>

*) これがまさに、次のコードが非常に問題となる理由です: template <T> void foo() { T * p = new T; delete p; }Imagine you say foo<int[4]>();...

于 2012-02-08T22:48:05.890 に答える
1

あなたの問題は にありtypedefます。次のことを試してください。

int bs = sizeof(new Bucket);

bsの値が 4 ( INT_PTR)であることがわかります。

于 2012-02-08T22:55:03.463 に答える