[問題] 一個專案使用兩種namespace

看板C_and_CPP作者 (トースト)時間10年前 (2015/06/06 01:18), 10年前編輯推噓3(3018)
留言21則, 5人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 2008 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 專案資料夾有訊號擷取卡專用的class檔案 問題(Question): 我將程式分成兩個部分 主程式是建立Socket通訊 主程式用的namespace是std 副程式是訊號擷取用的程式 我將此副程式放在.h檔裡 由主程式去include放在.h檔裡的副程式來呼叫 為了使用訊號擷取卡的指令 所以必須使用該擷取卡提供的namespace 然後副程式我有新增一些東西 所以還有使用到std這個namespace 所以副程式共使用了兩種namespace 主程式及副程式若單獨分開編譯不會有任何error 也都可以使用 但不管是用我這種呼叫方式 或是將主 副程式放在同一個cpp檔裡編譯 主程式建立Socket的其中一行會出現error 不知該如何解決 程式預期功能: 此程式預期功能是當通訊成功建立時 呼叫副程式開始擷取訊號 錯誤結果(Wrong Output): 初始化Socket通訊的部分 int iResult = WSAStartup( MAKEWORD(2,2), &wsaData ); 這一行出現 error c2872 'uint8': ambiguous symbol 的error 程式碼(Code):(請善用置底文網頁, 記得排版) 我的主副程式大致上的寫法如下: //以下是主程式,放在cpp檔裡 ..... #include <winsock.h> #include "InstantAI.h" using namespace std; #pragma comment(lib,"ws2_32.lib") //Winsock Library int main() { ...... if(socket_used == true) { // Initialize Winsock. WSADATA wsaData; SOCKET AcceptSocket; int iResult = WSAStartup( MAKEWORD(2,2), &wsaData ); ...... Datareadfunction() ...... } } //以下是副程式,放在InstantAI.h檔裡 ..... using namespace Automation::BDaq; using namespace std; void Datareadfunction() { .... } 經反覆測試發現似乎是使用了兩種namespace造成衝突 請問這問題該如何解決? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 163.25.118.211 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1433524717.A.35E.html ※ 編輯: t78923t (163.25.118.211), 06/06/2015 01:19:43

06/06 01:19, , 1F
可能有func名稱在兩個namespace都有?
06/06 01:19, 1F
※ 編輯: t78923t (163.25.118.211), 06/06/2015 01:23:06 你的意思是我兩個namespace下 有同時使用同一個變數造成重複定義namespace嗎? 如果是這樣的話 C++應該會幫我指出是哪一個變數或func吧? 但他是特別指出該行的'uint8': ambiguous symbol 這我不知道是什麼意思 ※ 編輯: t78923t (163.25.118.211), 06/06/2015 01:30:22

06/06 01:33, , 2F
剛剛有想到會不會是有header中重複定義typedef uint8?
06/06 01:33, 2F

06/06 01:35, , 3F
這部分可能要用"uint8"當key word找看看
06/06 01:35, 3F
你是指用ctrl+F 搜尋每個有用到的header中的"uint8"嗎?? ※ 編輯: t78923t (163.25.118.211), 06/06/2015 01:44:33

06/06 08:50, , 4F
大概是winsock.h 跟訊號擷取卡了
06/06 08:50, 4F

06/06 22:04, , 5F
如果不include"InstantAI.h", 也不呼叫該函式, 也會衝突嗎?
06/06 22:04, 5F
若不include"InstantAI.h",單純只有Socket部分的主程式並不會有此error

06/07 13:12, , 6F
gcc -E.....
06/07 13:12, 6F

06/07 13:12, , 7F
有時候不見得是namespace,而是萬惡的#define造成的
06/07 13:12, 7F

06/07 13:13, , 8F
另外他的意思是說該行用uint8 可以匹配到一個以上的
06/07 13:13, 8F

06/07 13:13, , 9F
function 所以他搞不清楚該用哪一個的意思
06/07 13:13, 9F

06/07 13:13, , 10F
很有可能是名字一樣簽名不同的兩個function
06/07 13:13, 10F
名字一樣簽名不同的意思是?? ※ 編輯: t78923t (120.126.5.217), 06/07/2015 20:35:03

06/08 00:36, , 11F
比方說一個void a(double) 一個void a(float)
06/08 00:36, 11F

06/08 00:37, , 12F
你輸入個a(1)編譯器就會跳這種錯誤
06/08 00:37, 12F

06/08 00:37, , 13F
因為他不知道要幫你用哪個好
06/08 00:37, 13F

06/08 01:29, , 14F
C2872 如原 PO 所發現的是 namespace 間的名字衝突
06/08 01:29, 14F

06/08 01:36, , 15F
如果是 #define 間的衝突的話應該不會出現 C2872
06/08 01:36, 15F

06/08 01:37, , 16F
uint8 這名字看起來像是型別, 所以我猜可能有某個 macro
06/08 01:37, 16F

06/08 01:37, , 17F
展開之後包含了用 #define 定義的型別名 uint8 造成衝突
06/08 01:37, 17F

06/08 01:38, , 18F
原 PO 能方便放上 InstantAI.h 的內容嗎?
06/08 01:38, 18F

06/08 01:38, , 19F
不能的話能否放上這檔案裡面有 uint8 這字的附近行數?
06/08 01:38, 19F

06/08 01:42, , 20F
啊, 看到一個很大的問題了...
06/08 01:42, 20F

06/08 01:43, , 21F
我回文解釋
06/08 01:43, 21F
文章代碼(AID): #1LSTdjDU (C_and_CPP)
文章代碼(AID): #1LSTdjDU (C_and_CPP)