为什么我不能像这样在 QMap 上调用插入?
Why can't I call insert on a QMap like this?
试图在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]
),我该如何修复它?
简单答案:类型不匹配。
您实际需要知道的是:不能为数组类型调用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
);
相关文章:
- 什么时候调用组成单元对象的析构函数
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 当我尝试在 Main 中调用插入函数时,它不是取数字?
- 类重载运算符 '<' 插入指向该对象集的共享指针时不调用
- 尝试在 std::map 中插入抽象类时没有用于调用的匹配函数
- 为什么插槽函数即使成功调用也无法插入文本
- LLVM插入功能调用到另一个函数中
- 为什么我不能在插入的函数调用中直接使用返回的指针作为参数
- 如何在LLVM传递中的模块末尾插入函数调用?
- 将类插入 STL 映射时出现"调用没有匹配函数"错误
- 使用指针数组中的对象调用重载的友元 ostream 插入运算符将返回内存地址
- 如何对表中的插入事件调用 exe
- 如何通过流插入运算符调用成员函数
- 为什么我不能像这样在 QMap 上调用插入?
- 插入 std::unordered_map 在 MSVC++ 的 STL 中调用哈希函数两次,设计不好还是特殊原因?
- 在万向节中插入函数调用
- 调用 std::map 的运算符 [] 或插入时发生了什么
- 在矢量中插入数据时多次调用复制构造函数
- 无序集,值得在插入之前调用find
- 在向std::unordered_map插入元素时避免不必要的构造函数调用