" 到 "int" 的適當轉換函數" type="hidden"/>

C++ socket bind()函數報錯 不存在從 "std::_Binder " 到 "int" 的適當轉換函數


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

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

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


長吧!!!哈哈哈

 

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

*******

*******

熱心的度娘告訴小寅有一篇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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM