私のコードでは、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&)
コンポジションで独自のコピー コンストラクターを空のボディで定義することで、この問題を解決しました。
ただし、あるケースでは独自のコピー コンストラクターを作成する必要があり、別のケースではコンパイラーが生成したコピー コンストラクターを使用できた理由はまだわかりません。もちろん、犯人はミューテックスです。この問題を引き起こしているのは、ミューテックスのコピーできないプロパティですか、それとも私が見逃しているものですか?