Re: [問題] 一個專案使用兩種namespace
仔細看了一下你的敘述我發現了一個很大的問題:
InstantAI.h 裡面使用了 using namespace
一般來說 header file 裡不應該宣告全域的 using 敘述
因為這會造成所有引入這個標頭檔的檔案強迫把所 using 的東西給打開
(這有個名詞叫 namespace pollution, 命名空間污染)
在這裡你的 InstantAI.h 裡的宣告污染到了主程式
然後因為 Automation::BDaq 下面大概也有一個 uint8
(全名 Automation::BDaq::uint8)
但 winsock 裡的 uint8 是全域的 (全名 ::uint8)
而它的 macro 也許是展開成不帶 :: 的 uint8
造成編譯器看到不帶 :: 的 uint8 時找到了這兩個候選人
但他不知道你是指誰 (因為 Automation::BDaq::uint8 被 using 打開了)
所以就噴 C2872
沒理解錯的話 InstantAI.h 應該是你自己寫的檔案
這樣的話有兩個方法, 一個治標, 一個治本
治標法是把 InstantAI.h 裡那兩行 using namespace 移到 Datareadfunction() 裡面
這樣那就是函式區塊裡才有 using namespace 的效果
於是函式外面的 uint8 就只看得到 winsock 定的 ::uint8
治本法是你就不要留函式實作在 .h 裡了, 留宣告就好
另外開一個 .cpp 寫 Datareadfunction()
using namespace 什麼的也移去那邊
最後編譯完再把兩個檔案連結起來
這樣兩個 .cpp 是各自的編譯單位, 誰都不會影響誰
--
'Oh, Harry, don't you see?' Hermione breathed. 'If she could have done
one thing to make absolutely sure that every single person in this school
will read your interview, it was banning it!'
---'Harry Potter and the order of the phoenix', P513
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.39.85
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1433700253.A.0AA.html
推
06/08 03:43, , 1F
06/08 03:43, 1F
→
06/08 03:44, , 2F
06/08 03:44, 2F
→
06/08 03:45, , 3F
06/08 03:45, 3F
→
06/08 03:46, , 4F
06/08 03:46, 4F
→
06/08 05:15, , 5F
06/08 05:15, 5F
→
06/08 10:16, , 6F
06/08 10:16, 6F
→
06/08 10:17, , 7F
06/08 10:17, 7F
→
06/08 10:18, , 8F
06/08 10:18, 8F
→
06/08 10:20, , 9F
06/08 10:20, 9F
→
06/08 10:21, , 10F
06/08 10:21, 10F
→
06/08 10:23, , 11F
06/08 10:23, 11F
→
06/08 11:16, , 12F
06/08 11:16, 12F
→
06/08 11:17, , 13F
06/08 11:17, 13F
→
06/08 11:21, , 14F
06/08 11:21, 14F
→
06/08 11:23, , 15F
06/08 11:23, 15F
→
06/08 11:24, , 16F
06/08 11:24, 16F
→
06/08 11:29, , 17F
06/08 11:29, 17F
→
06/08 11:31, , 18F
06/08 11:31, 18F
推
06/08 12:08, , 19F
06/08 12:08, 19F
→
06/08 12:15, , 20F
06/08 12:15, 20F
→
06/08 12:16, , 21F
06/08 12:16, 21F
→
06/08 12:16, , 22F
06/08 12:16, 22F
→
06/08 13:09, , 23F
06/08 13:09, 23F
→
06/08 13:09, , 24F
06/08 13:09, 24F
→
06/08 13:10, , 25F
06/08 13:10, 25F
→
06/08 13:11, , 26F
06/08 13:11, 26F
→
06/08 13:14, , 27F
06/08 13:14, 27F
→
06/08 13:15, , 28F
06/08 13:15, 28F
→
06/08 13:17, , 29F
06/08 13:17, 29F
→
06/08 13:20, , 30F
06/08 13:20, 30F
基本上正常來說 anyoiuo 提的方式才是使用 namespace 下的符號的正道
只是這裡不巧的是用它的人是 winsock 的 macro (大概就是 MAKEWORD)
那個 header 沒有考慮到 namespace 的問題 (或者根本就是 C header)
因此才必須要倒過來使用避免 namespace pollution 的方式把東西分開
※ 編輯: LPH66 (140.112.30.32), 06/08/2015 15:51:11
→
06/08 16:51, , 31F
06/08 16:51, 31F
→
06/08 16:52, , 32F
06/08 16:52, 32F
→
06/08 18:00, , 33F
06/08 18:00, 33F
推
06/09 22:22, , 34F
06/09 22:22, 34F
→
06/09 22:23, , 35F
06/09 22:23, 35F
→
06/10 01:19, , 36F
06/10 01:19, 36F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):