boost::asio::io_service的初始化
在boost_1_39_0\boost\asio\io_service.hpp里的定义是
class io_service
: private noncopyable
而noncopyable的拷贝赋值是私有成员
class noncopyable
{
protected:
noncopyable() {}
~noncopyable() {}
private: // emphasize the following members are private
noncopyable( const noncopyable& );
const noncopyable& operator=( const noncopyable& );
};
也就是说io_service是不能拷贝赋值的
但是asio的例子里都是这样的代码:
class A
{
io_service &io;
public:
A(io_service&io_):io(io_)
{
}
}
这是为什么?
我一开始也没注意,但是后来自己写的时候不知道怎么就编译报错了。
error C2248: “boost::noncopyable_::noncopyable::noncopyable”: 无法访问 private 成员(在“boost::noncopyable_::noncopyable”类中声明)
1> f:\boost_1_39_0\boost\noncopyable.hpp(27) : 参见“boost::noncopyable_::noncopyable::noncopyable”的声明
1> f:\boost_1_39_0\boost\noncopyable.hpp(22) : 参见“boost::noncopyable_::noncopyable”的声明
1> 此诊断出现在编译器生成的函数“boost::asio::io_service::io_service(const boost::asio::io_service &)”中
[解决办法]
是我眼花了?
io_service &io;
这不是拷贝,这只是一个引用。
帖编译过不去的代码吧。
[解决办法]
写了一个测试代码,编译通过,没出现你说的问题。
- C/C++ code
#include <iostream>#include <boost/thread.hpp>#include <boost/asio.hpp>using namespace std;using namespace boost;using namespace boost::asio;class A{ io_service& io;public: A(io_service& io_): io(io_) { }};int main(){ io_service io; A a(io); return 0;}
[解决办法]
所以,你的问题应该是没有使用引用,而是使用了拷贝。比如:
- C/C++ code
class A{ io_service io;public: A(io_service io_): io(io_) { }};
[解决办法]
io_service &io;
这里只是使用了应用,你的构造函数初始化列表给这个引用赋值,没有调用拷贝构造函数。是可以的。