尝试在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版本,因为它更紧凑,最终是我的项目所需的形式
我猜我只是错过了typedef
最终解释的方式。为什么insert
的第二个参数显然是Buffer *
(不是Buffer(*)[4]
),我该如何解决?
答案 0 :(得分:2)
简单回答:类型不匹配。
您实际需要了解的内容:您无法为数组类型调用new
表达式。因此,以下两个不等同(第一个不合法):
typedef T TArr[4]; TArr * p = new TArr; // #1
T * q = new T[4]; // #2
这种语言不起作用。第二个版本创建一个动态数组,而第一个版本想要创建一个类型为“4 T数组”的动态对象,这是不可能的。相反,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]>();
...
答案 1 :(得分:1)
您的问题出在typedef
。请尝试以下方法:
int bs = sizeof(new Bucket);
您会看到bs
的值为4(INT_PTR
);