在与Boost.Asio的绝望战斗中,我遇到了很多困难。
其中一个是我很难找到“boost :: noncopyable errors”!!
如果我意外违反了不可复制的规定,IDE只会在noncopyable.hpp或其他地方向我显示一些错误,但在我的文件中无处。
我只能通过评论找到错误并且在任何地方取消注释asio对象存在。
(ps:我的IDE是visual c ++ 2008,这个IDE与Boost的关系不好吗?)
修改
我知道阅读整个错误消息会有所帮助。 但是这个怎么样?
1>d:\boost\include\boost-1_42\boost\asio\basic_io_object.hpp(92) : error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable'
1> d:\boost\include\boost-1_42\boost\noncopyable.hpp(27) : see declaration of 'boost::noncopyable_::noncopyable::noncopyable'
1> d:\boost\include\boost-1_42\boost\noncopyable.hpp(22) : see declaration of 'boost::noncopyable_::noncopyable'
1> This diagnostic occurred in the compiler generated function 'boost::asio::basic_io_object<IoObjectService>::basic_io_object(const boost::asio::basic_io_object<IoObjectService> &)'
1> with
1> [ IoObjectService=boost::asio::stream_socket_service<boost::asio::ip::tcp> ]
这都是由此引起的
tcp::socket getSocket(){
return m_socket;
}
(应该是:
tcp::socket& getSocket(){
return m_socket;
}
)
当该文件中有许多函数时,你们能快速找到它吗?
(ps2:也许所有这些麻烦都是由我的pooooooor c ++编程经验引起的?)
答案 0 :(得分:3)
似乎VC ++根本不会告诉你使用复制构造函数的尝试在哪里。
例如,G ++确实:
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
class X
{
tcp::socket s;
public:
tcp::socket get() { return s; }
};
结果:
blah blah blah noncopyable blah blah
...
untitled1.cpp: In member function 'boost::asio::blah blah X::get()':
untitled1.cpp:8: note: synthesized method 'boost::asio::blah(const boost::asio::blah&)' first required here
有几次我刚刚设法用GCC编译源代码来找出VC ++的错误信息(反之亦然)。
如果不尝试偶尔编译它,也许不会写很多非工作代码。
答案 1 :(得分:1)
我最近与一个类似的问题进行了斗争,其中不可复制的项目是我想通过引用返回的类的成员。
我通过使复制构造函数为几个可疑类私有来跟踪它,并以这种方式找到了问题。
如果你要返回不可复制的boost类实例,那么帮助不大。