2010-09-21 42 views
4

与Boost.Asio拼死拼搏,我遇到了很多困难。如何找到“boost :: noncopyable”错误?

其中之一是,我很难找到其中“升压::不可复制的错误”是!

如果我意外违反了非拷贝规则,IDE只会在noncopyable.hpp或其他地方显示一些错误,但我的文件中没有任何地方存在

我只能通过评论找到错误&取消注释无处不在asio对象存在。

(PS:我的IDE是的Visual C++ 2008年,是这个IDE与升压关系不好?)

编辑:

我知道,阅读整个错误信息帮助了很多东西。 但是这个怎么样?

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

阅读整个错误信息通常会帮助那里......阅读James McNellis的答案。编译器通常会提供更好的错误报告,我们会仔细阅读,并且这样做可以多次掩盖实际错误......但这是另一回事。 – 2010-09-21 07:51:12

+0

我承认要问这个问题太抽象了...并编辑它。 – rhapsodyn 2010-09-21 11:53:01

回答

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++的错误消息几次(和其他方式)。

也许不偶尔编写很多非工作代码。

+0

我不清楚,编译器不告诉OP复制构造函数的引用发生在哪里。他注意到自己发现了一行代码 - “这一切都是由这个造成的” - 而且这似乎是我错误信息顶部引用的头文件行。 – 2010-09-21 14:03:36

+0

我不认为'提升'本身就是越野车。有三件事:1)错误(boost :: noncopyable不可复制),2)是什么导致了错误(自动生成一个不可复制的类的复制构造函数,3)用户代码中的哪一行需要复制构造函数。该消息不包含第三项。我认为OP通过非常努力地研究代码来发现罪魁祸首。 VC++没有指向调用复制构造函数的实际位置。 – UncleBens 2010-09-21 14:16:47

1

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

我通过使复制构造函数对于几个可疑类是私人的,从而对其进行了追踪,并发现了这个问题。

但是,如果您要返回不可复制的boost类实例,没有太大的帮助。