为什么我不能像这样在 QMap 上调用插入?

Why can't I call insert on a QMap like this?

本文关键字:调用 插入 QMap 不能 像这样 为什么      更新时间:2023-10-16

试图在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::stringstd::map将其转换为等价的示例,以达到相同的效果。我展示了Qt版本,因为它更紧凑,最终也是我的项目所需的形式
我想我只是错过了一些关于typedef最终如何解释的东西。为什么insert的第二个参数显然是Buffer *(而不是Buffer(*)[4]),我该如何修复它?

简单答案:类型不匹配。

您实际需要知道的是:不能为数组类型调用new表达式。因此,以下两个是不等价的(第一个是不合法的):

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

这种语言就是不起作用。第二个版本创建一个动态数组,而第一个版本希望创建一个类型为"array of 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]>();

您的问题在typedef中。尝试以下操作:

int bs = sizeof(new Bucket);

并且你会看到bs的值是4(INT_PTR);