【问题标题】:Using boost::mutex - implicitly deleted error (because the default definition would be ill-formed)使用 boost::mutex - 隐式删除错误(因为默认定义格式不正确)
【发布时间】:2014-04-28 19:24:02
【问题描述】:

.h 文件(标题)中的类如下所示

#include <boost/thread.hpp>

class MyClass{

    private:
        boost::mutex bPoolMtx_;

        // ... other vars
    public:
        // public vars and methods

}

我在尝试构建/编译时遇到以下错误。

MyClass.h:38:7: note: ‘MyClass::MyClass(const MyClass&)’ is implicitly deleted because the default definition would be ill-formed:
MyClass.h:38:7: error: use of deleted function ‘boost::mutex::mutex(const boost::mutex&)’

我还没有在 cpp 文件中使用互斥锁。当我注释掉 boost::mutex 行时,它构建得很好。怎么回事?

【问题讨论】:

  • 表示互斥量不可复制。您可能正在某处复制 MyClass 实例。这要求数据成员是可复制的。
  • 没错。尝试禁用 MyClass 的复制,然后看看会发生什么。

标签: c++ boost


【解决方案1】:

编译器生成的默认复制构造函数默认复制所有数据成员。您使用 boost::mutex 会引发错误,因为互斥锁不可复制。

您可以编写自己的复制构造函数,该构造函数不会尝试复制互斥体,或者只是删除MyClass 的复制构造函数。

#include <boost/thread.hpp>

class MyClass{
    private:
        boost::mutex bPoolMtx_;

        // ... other vars
    public:
        // public vars and methods
        MyClass(const MyClass&) = delete;
}

【讨论】:

  • 这是否意味着如果我想使用互斥锁就不能复制 MyClass?例如在某处有一个vector
  • 您需要编写自己的复制构造函数来复制数据但构造一个新的互斥体。
  • 我明白了。感谢您的回复,我现在通过存储指针来修复它,因为不需要复制。谢谢
  • “感谢您的回复,我现在通过存储指针来修复它,因为不需要复制。” - 8-| ...危险潜伏。
  • 使用指针意味着副本和原件将锁定同一个互斥锁(即,当原件上的方法调用获取互斥锁时,副本上的所有内部同步方法调用也将阻塞) .这可能不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 2013-11-21
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 2016-09-11
相关资源
最近更新 更多