需要使用互斥量显式定义复制构造函数
Copy constructor required to be explicity defined with mutex
在我的代码中,我没有故意为 Complex 和 Composition classes 定义复制构造函数。我希望使用编译器提供给我的复制构造函数
#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改成如下
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 中用一个空主体定义自己的复制构造函数来解决这个问题。
但是,我仍然不确定为什么我必须在一种情况下创建自己的复制构造函数,而在另一种情况下却能够通过编译器生成的复制构造函数。罪魁祸首当然是互斥量。是互斥锁的不可复制 属性 造成了这个问题,还是我遗漏了什么?
来自 this 页
Class mutex
The mutex class is a model of Mutex and NonCopyable, and provides no
additional facilities beyond the requirements of these concepts.
因为 boost::mutex
是不可复制的,如果您将 class contains/inherits 作为成员,编译器将不会生成复制构造函数。
在我的代码中,我没有故意为 Complex 和 Composition classes 定义复制构造函数。我希望使用编译器提供给我的复制构造函数
#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改成如下
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 中用一个空主体定义自己的复制构造函数来解决这个问题。
但是,我仍然不确定为什么我必须在一种情况下创建自己的复制构造函数,而在另一种情况下却能够通过编译器生成的复制构造函数。罪魁祸首当然是互斥量。是互斥锁的不可复制 属性 造成了这个问题,还是我遗漏了什么?
来自 this 页
Class mutex
The mutex class is a model of Mutex and NonCopyable, and provides no additional facilities beyond the requirements of these concepts.
因为 boost::mutex
是不可复制的,如果您将 class contains/inherits 作为成员,编译器将不会生成复制构造函数。