gpt4 book ai didi

c++ - 无法访问类中声明的私有(private)成员 'QReadWriteLock' 错误 1 ​​错误 C2248 : 'QReadWriteLock::QReadWriteLock'

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:10 25 4
gpt4 key购买 nike

这真的感觉像是 Qt 中的一个错误。任何人都有解决方案或我应该将其作为错误提交吗?

#include <QReadWriteLock>

class FileInfoWrapper {

public:
explicit FileInfoWrapper(const QFileInfo& _fileInfo);
~FileInfoWrapper();

private: // also tried public
mutable QReadWriteLock lock_;

甚至在使用它之前,我得到了错误:

Error 1 error C2248: 'QReadWriteLock::QReadWriteLock' : cannot access private member declared in class 'QReadWriteLock'

不管它是私有(private)的/公共(public)的还是我包含的类。我似乎无法在堆栈上创建它。相反,我使用“new”在堆上创建了一个,但是当我尝试在构造函数中删除它时,我的应用程序崩溃了:

Unhandled exception at 0x5090f39a (QtCored4.dll) in MyApp.exe: 0xC0000005: Access violation reading location 0xfeeeff0e.

调用堆栈:

QtCored4.dll!QHash::~QHash() Line 283 + 0xa bytes C++ QtCored4.dll!QReadWriteLockPrivate::~QReadWriteLockPrivate() + 0x38 bytes C++ QtCored4.dll!QReadWriteLockPrivate::`scalar deleting destructor'() + 0xf bytes C++ QtCored4.dll!QReadWriteLock::~QReadWriteLock() Line 137 + 0x1e bytes C++ CloudSync.exe!FileInfoWrapper::~FileInfoWrapper() Line 76 + 0x15 bytes C++

QReadWriteLockPrivate 中的变量“d”似乎被删除了两次。但是,这在另一个类中有效,我还必须在堆上创建锁,然后在构造函数中将其删除。

在 Visual Studio 中运行 Qt 4.8.0。在 Qt Creator 4.7.4 中有同样的问题。

最佳答案

您必须使用指针,因为 QReadWriteLock 不可复制(它使用 Q_DISABLE_COPY)并且您正在以某种方式复制您的 FileInfoWrapper 对象(通过例如将它们存储在容器中)。
因此指针地址在这些拷贝之间共享,并为每个拷贝删除一次。

您可以将指针包裹在智能指针中,这样删除操作只会在对象的最后一个拷贝被删除时发生。

QSharedPointer<QReadWriteLock> lock_;

关于c++ - 无法访问类中声明的私有(private)成员 'QReadWriteLock' 错误 1 ​​错误 C2248 : 'QReadWriteLock::QReadWriteLock' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9507604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com