1. 程式人生 > >C++ socket bind()函數報錯 不存在從 "std::_Binder<std::_Unforced, SOCKET &, sockaddr *&, size_t &>" 到 "int" 的適當轉換函數

C++ socket bind()函數報錯 不存在從 "std::_Binder<std::_Unforced, SOCKET &, sockaddr *&, size_t &>" 到 "int" 的適當轉換函數

成員 include info cor pac 希望 原因 是我 clu

昨天還可以正常運行的程序,怎麽今天改了程序的結構就報錯了呢?我明明沒有改動函數內部啊!!!

內心無數只“草泥馬技術分享圖片”在奔騰,這可咋辦呢?於是乎,小寅開始求助於親愛的度娘......

由於小寅知識水平有限,終於在花了很長的時間後找到了原因所在,時間大概這麽


長吧!!!哈哈哈

技術分享圖片

首先向各位小夥伴展示一下小寅的錯誤代碼,如下圖:

*******

技術分享圖片

*******

熱心的度娘告訴小寅有一篇CSDN的文章有解決方法:

技術分享圖片

Ps: 原文地址:https://blog.csdn.net/youyicc/article/details/80403833 (小寅是愛護知識產權的好青年,再此奉上大佬的文章地址)

抱著崇拜大佬的心態(菜鳥內心獨白),小寅勇敢的加上了::(此處雙冒號是中文,主要是方便大家閱讀,因為英文雙冒號太小了)

技術分享圖片

果然在大佬的指引下,偉大了VS也屈服了,那讓人惡心的紅色波浪線終於去世了,哈哈哈哈。

然而。。。。。。。。。。。。。。

小寅可是個愛學習技術分享圖片 的孩子,我並不知道為什麽要這樣做啊!!!

於是乎,我有吭哧吭哧地跑去找度娘了.....

又過了很久。。。。。。。。很久。。。。。。

我終於回來了~~~~

待我向大家娓娓道來,看完你就會不由自主的發出一聲 “哦,原來是這樣啊” 的贊嘆,哈哈哈哈

首先,解釋雙冒號都有些啥子作用:

1. 表示“域操作符”:

  例如:你有一個神奇的類,它叫做A(小明),A中有一個成員函數叫做function1(),當你要在cpp文件中定義這個函數時,應該這樣寫 A::function()

2. 表示全局函數,直接用在全局函數前:

  這個用法就是我們上面的解決方法

3. 表示引用成員函數及變量,作用域成員運算符:

  例如:System::Math::Sqrt() 相當於System.Math.Sqrt()

其次解釋完了雙冒號的作用,可能有些小夥伴還是有點迷糊技術分享圖片

重點來了,敲黑板(屏幕)!

1. 在我們一開始,bind的函數報錯的原因是由於我們引用了命名空間std,如圖:

技術分享圖片

2. 這時我們查找std下的函數是會發現有一個和套接字bind綁定同名的函數,如圖:

技術分享圖片

3. 所以報錯的原因就一目了然了:我們原本想要使用#include<WinSock2.h>頭文件下的bind函數,結果卻由於作用域的沖突造成

  bind函數變成了std下的函數。

然後,進一步提出更優解:

不要隨意的使用

using namespace std;

而應該這樣使用

std::cout<<x<<std::endl

這樣的話就不容易造成作用域沖突,而且也比在bind函數前加::要更加嚴謹。

證據如圖:

技術分享圖片

******整篇文章就結束啦,希望這篇文章能夠給小夥伴們提供一丁點幫助******

Thanks for your reading

C++ socket bind()函數報錯 不存在從 "std::_Binder<std::_Unforced, SOCKET &, sockaddr *&, size_t &>" 到 "int" 的適當轉換函數