2012-02-08 119 views
0

试图编译以下代码Qt的SDK 4.7.4下桌面 - MinGW的4.4结果在编译错误下面:为什么我不能在这样的QMap上调用插入?

#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转换这对一个quivalent示例和std::map具有相同的效果。我提供了Qt版本,因为它更紧凑,并且最终是我的项目需要的形式。
我在猜测,我只是错过了一些关于如何最终解释typedef。为什么insert显然是Buffer *(不是Buffer(*)[4])的第二个参数,我该如何解决?

+0

为什么使用typedef?为什么不创建一个新的Bucket类?好像你正在尝试将它用作对象。 – 2012-02-08 23:09:50

回答

2

简单的答案:类型不匹配。

实际需要了解的内容:对于数组类型,不能调用new表达式。因此,以下两个不等同(并且第一个不合法):

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

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

该语言不起作用。第二个版本创建一个动态数组,而第一个版本想创建一个类型为“4T数组”的单个动态对象,这是不可能的。相反,new TArr其实是一样的new T[4],因此结果是四个T s的一个动态阵列。*

你应该基本上只是更改地图的值类型要么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; }想象一下,你说foo<int[4]>(); ...

+0

但是如果'Buffer'(基本上)是Bucket [16]'并且你可以做'新Bucket [16]',那么为什么你不能'new Buffer'呢? – 2012-02-08 22:51:36

+0

@SethCarnegie:你可以(编辑),但你没有得到你的想法。你只能得到指向基本类型的指针和一个动态数组*。没有可以通过(非数组)'new'动态创建的单一类型“T的数组”。 – 2012-02-08 22:54:37

+0

这似乎很奇怪,因为'#define TArr T [4](换行符)T * blah =新的TArr;''''但是'typedef T TArr [4]; T * blah =新的TArr;'不是 – 2012-02-08 22:58:36

1

你的问题是在typedef。请尝试以下操作:

int bs = sizeof(new Bucket); 

,你会看到,bs值是4(INT_PTR);

相关问题