仔细看了一下你的叙述我发现了一个很大的问题:
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 是各自的编译单位, 谁都不会影响谁