如何找到“boost :: noncopyable”错误?

时间:2010-09-21 04:01:57

标签: c++ debugging boost

在与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 ++编程经验引起的?)

2 个答案:

答案 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类实例,那么帮助不大。