【问题标题】:How to locate "boost::noncopyable" errors?如何定位“boost::noncopyable”错误?
【发布时间】:2010-09-21 04:01:57
【问题描述】:

在与Boost.Asio的殊死搏斗中,我遇到了很多困难。

其中之一是我几乎无法定位“boost::noncopyable 错误”在哪里!!

如果我不小心违反了不可复制的规定,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:也许所有这些麻烦都是我糟糕的c++编程经验造成的??)

【问题讨论】:

  • 阅读整个错误消息通常会有所帮助...阅读 James McNellis 的答案。编译器通常会提供更好的错误报告,我们愿意阅读,而且这样做很多时候会掩盖实际错误……但这是另一回事。
  • 我承认问的问题太抽象了...并编辑了它。

标签: c++ debugging boost


【解决方案1】:

似乎 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++ 的错误消息(反之亦然)。

如果不偶尔尝试编译它,也许也不会编写太多非工作代码。

【讨论】:

  • 我不清楚编译器没有告诉 OP 对复制构造函数的引用发生在哪里。他自己指出,他找到了这行代码——“都是由这个引起的”——在我看来,这很可能是错误消息顶部引用的头文件行。
  • 我不认为boost 本身有问题。有三件事:1)错误(boost::noncopyable 不可复制),2)导致错误的原因(自动为不可复制的类生成复制构造函数,3)用户代码中的哪一行需要复制构造函数。该消息不包含第 3 项。我认为 OP 通过非常努力地研究代码找到了罪魁祸首。 VC++ 并不指向调用复制构造函数的实际位置。
【解决方案2】:

我最近遇到了一个类似的问题,其中不可复制的项目是我打算通过引用返回的类的成员。

我通过将复制构造函数对几个可疑类设为私有来跟踪它,并以这种方式发现了问题。

如果您返回不可复制的 boost 类实例,则帮助不大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2012-03-05
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多