Конструктор копирования должен быть детально определен с мьютексом

В моем коде я специально не определил конструкторы копирования для классов Complex и Composition. Я хочу использовать конструктор копирования, предоставленный мне компилятором

#include<boost/make_shared.hpp>
#include<boost/shared_ptr.hpp>
#include <boost/thread/mutex.hpp>

class Complex
{
private :
std::string _a;
std::string _b;
};

class Composition
{
public:
Composition(){}
Composition(int x, int y)
{
_x = x;
_y = y;
}
private:
int _x;
int _y;
Complex obj;
};

int main()
{
//Used make_shared this way on purpose
boost::shared_ptr<Composition> ptr = boost::make_shared<Composition>(Composition(1,2) );
}

Приведенный выше код компилируется без проблем.

Теперь я изменяю сложный класс следующим

class Complex
{
private :
std::string _a;
std::string _b;
boost::mutex _mutex;
};

Когда я компилирую код, я получаю ошибку

/usr/local/include/boost/smart_ptr/make_shared.hpp:660: error: no matching function for call to ‘Composition::Composition(const Composition&)’
note: candidates are: Composition::Composition(int, int)
note:                 Composition::Composition()
note:                 Composition::Composition(Composition&)

Я решил эту проблему, определив свой собственный конструктор копирования в Composition с пустым телом.

Однако я до сих пор не уверен, почему мне пришлось создавать собственный конструктор копирования в одном случае, и я смог обойтись сгенерированным компилятором одним в другом. Виновником, конечно, является мьютекс. Это не копируемое свойство мьютекса, создающее эту проблему, или я что-то упускаю?

0

Решение

От этот страница

Класс мьютекс

Класс Mutex является моделью Mutex и NonCopyable, и не дает
дополнительные возможности, выходящие за рамки требований этих концепций.

Так как boost::mutex is NonCopyable, компилятор не будет генерировать конструктор копирования, если ваш класс содержит / наследует его как член.

1

Другие решения


По вопросам рекламы [email protected]