仔細看了一下你的敘述我發現了一個很大的問題:
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 是各自的編譯單位, 誰都不會影響誰