В моем коде я специально не определил конструкторы копирования для классов 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 с пустым телом.
Однако я до сих пор не уверен, почему мне пришлось создавать собственный конструктор копирования в одном случае, и я смог обойтись сгенерированным компилятором одним в другом. Виновником, конечно, является мьютекс. Это не копируемое свойство мьютекса, создающее эту проблему, или я что-то упускаю?
От этот страница
Класс мьютекс
Класс Mutex является моделью Mutex и NonCopyable, и не дает
дополнительные возможности, выходящие за рамки требований этих концепций.
Так как boost::mutex
is NonCopyable, компилятор не будет генерировать конструктор копирования, если ваш класс содержит / наследует его как член.