2010-03-16 50 views
2

我對C++相當陌生,而且我很可能在我的腦海中,但事情就是這樣。與Boost一起使用Winsock bind()調用時出現「無法推論出模板參數」錯誤

我正在使用一個相當大的Win32 C++項目,它使用Winsock進行網絡通信。我正在嘗試將一些線程管理轉換爲boost,但是一旦我添加了對boost庫的引用,而不是,我在這行代碼中遇到了大約30個錯誤:

bind(mLocalSocketFd, (struct sockaddr *) &localServerAddress, sizeof(localServerAddress)); 

這些錯誤包括像:

error C2602: 'std::tr1::_Result_of2<_Fty,_Farg0,_Farg1>::_Type' is not a member of a base class of 'std::tr1::_Result_of2<_Fty,_Farg0,_Farg1>' 
error C2868: 'std::tr1::_Result_of2<_Fty,_Farg0,_Farg1>::_Type' : illegal syntax for using-declaration; expected qualified-name 
error C2784: 'bool std::operator <(const std::vector<_Ty,_Ax> &,const std::vector<_Ty,_Ax> &)' : could not deduce template argument for 'const std::vector<_Ty,_Ax> &' from 'std::tr1::_Bind_fty<_Fty,_Ret,_BindN>' 
error C2784: 'bool std::operator <(const std::vector<_Ty,_Ax> &,const std::vector<_Ty,_Ax> &)' : could not deduce template argument for 'const std::vector<_Ty,_Ax> &' from 'std::tr1::_Bind_fty<_Fty,_Ret,_BindN>' 

我猜想,不知怎的,我已經成功地告訴這個特殊的文件(「NetServer.cpp」)使用綁定()的增壓版本,但對於我的生活,我無法弄清楚發生了什麼。我使用boost的唯一部分是boost/thread.hpp,並且我沒有使用NetServer.cpp中的任何地方或者它鏈接到的頭文件來進行任何命名空間。

任何有關我在做什麼錯的建議,或者如何解決它?這顯然是一些愚蠢的新手,但我無法弄清楚。

回答

2

有一個Boost function called bind()這是從Winsock's bind()完全不同的東西。

你有兩個選擇,如果你需要一個給定的模塊中使用兩種功能:

  1. 不要「使用空間boost」之稱。相反,明確限定您的代碼中使用Boost。我更喜歡這個選項,因爲Boost是第三方庫,其短名稱可能與其他第三方庫以及採用Boost特性的未來版本的C++發生衝突。偶爾我會在單個函數中使用「使用命名空間提升」,如果它包含幾個Boost的用法。

  2. 明確限定使用全球Winsock的綁定(的):

    ::bind(mLocalSocketFd, ...

+0

我不是「使用命名空間增強;」我可以找到標題層次結構中的任何位置,這就是讓我困惑的原因。我仍然不確定它爲什麼試圖在該特定文件中使用boost命名空間。但我不知道::作爲一個全局命名空間限定符。添加解決了這個問題。謝謝。 – 2010-03-17 16:03:58

2

你可以從MSVC的神祕的錯誤消息看,你bind電話將轉入std::tr1::bind

所以,可能你使用的是namespace std;

正如@Warren Young指出的那樣,::bind會將您的電話轉向非標準bind標識符 - 然後在您的情況下爲WinSock

+0

謝謝,我認爲就是這樣。 – 2011-09-16 20:15:18

1

我剛剛遇到了同樣的問題,並發現了一個微軟官方回答這裏:http://connect.microsoft.com/VisualStudio/feedback/details/500364/how-to-avoid-conflicts-between-tr1-bind-and-winsock-bind-function

短版:即使你不調用boost命名空間,我想你有一個using namespace std地方,由於我猜你正在使用VS2010,它有tr1擴展名,所以using namespace std的作用就像using namespace boost的bind()函數與VS2010。

如果你有什麼電話using namespace std提前然後

你讓所有的std下提供給不合格 名稱查找的名字。因此,在重載解析期間,Winsock的bind()和bind()都會被考慮,並且因爲 的bind()是模板,所以它通常會獲勝,但不會在以後編譯 。

解決方案

爲了解決這個問題,請致電:: bind()的時候,你想的Winsock的bind(),和 的std :: bind()的,如果你想的綁定( )。當你調用 :: bind()時,你要求編譯器只查看全局命名空間 。

或者,不要使用名稱空間標準。

相關問題