2010-09-21 44 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類實例,沒有太大的幫助。