我在 Qt 工作,我没有提到它,因为我认为这只是 C++ 问题。
我用共享指针解决了这个问题,所以不要给我解决方案。但这是理解的问题,我想了解为什么它不起作用。
我正在尝试以下操作:
测试.h:
#include <QObject>
#include "response.h"
#include <memory>
class Test : public QObject
{
Q_OBJECT
public:
explicit Test(QObject *parent = nullptr);
signals:
void signal(std::unique_ptr<Response> resp);
public slots:
};
测试.cpp:
Test::Test(QObject *parent) : QObject(parent)
{
std::unique_ptr<Response> response(new Response(5));
emit signal(std::move(response));
}
Response
班级:
class Response
{
public:
Response(int data);
private:
int data;
};
我知道std::unique_ptr
不能复制,我std::move
在这里使用。但尽管如此,我得到一个错误:
moc_test.cpp:75:85: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Response; _Dp = std::default_delete<Response>]’
case 0: _t->signal((*reinterpret_cast< std::unique_ptr<Response>(*)>(_a[1]))); break;
在下面的代码片段中moc_test.cpp
,它是 Qt 元对象系统的产物:
void Test::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void `_a)
{
if (_c == QMetaObject::InvokeMetaMethod) {
auto *_t = static_cast<Test *>(_o);
Q_UNUSED(_t)
switch (_id) {
//------- !! This line!!
case 0: _t->signal((*reinterpret_cast< std::unique_ptr<Response>(*)>(_a[1]))); break;
default: ;
}
} else if (_c == QMetaObject::IndexOfMethod) {
int *result = reinterpret_cast<int *>(_a[0]);
{
using _t = void (Test::*)(std::unique_ptr<Response> );
if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&Test::signal)) {
*result = 0;
return;
}
}
}
}
花了很多时间,但我无法弄清楚为什么会发生这个错误,并且在互联网上没有找到任何有用的东西。