【问题标题】:Issue in compiling with marshal.h : error C2872: 'IServiceProvider' : ambiguous symbol使用 marshal.h 编译时出现问题:错误 C2872:'IServiceProvider':不明确的符号
【发布时间】:2017-08-13 16:29:13
【问题描述】:

我正在尝试在我的 C++/CLI 项目中使用编组库。当使用#include <msclr/marshal.h> 编译时,我收到错误error C2872: 'IServiceProvider' : ambiguous symbol。大多数决议似乎都建议移动#include <windows.h> 就像这里的那个-> Ambiguous references,但我没有这些。我只有:

using namespace System;
using namespace System::Configuration;
using namespace std;
#include <msclr/marshal.h>

如何调试这个问题?

【问题讨论】:

    标签: c++-cli


    【解决方案1】:

    你确实间接地包含了它。它在全局命名空间中转储了大量的标识符。宏特别笨拙,其中很多与框架中使用的名称匹配。

    marshal.h 所做的很多事情也可以由 Marshal 类完成。但我无法帮助你,你没有提到你为什么要使用它。您可以通过将 #include 指令放在 using 语句之前 来解决这个特殊的问题:

    #include <msclr/marshal.h>
    using namespace System;
    using namespace System::Configuration;
    

    【讨论】:

    • 我正在尝试将 String ^ 转换为 const char*
    • Marshal::StringToCoTaskMemAnsi + Marshal::FreeCoTaskMem.
    • 也可以使用 System::String^ 来避免在 header 中使用
    【解决方案2】:

    确保您只有:

    using namespace System;
    

    在 CLR 项目的 cpp 文件中,而不是在标头中。 Visual Studio 在创建 CLR 类库项目时会自动将其添加到标题中。 在 cpp 本身中,include 必须位于“using namespace”之前。

    【讨论】:

    • 确实,这再次证实了头文件中的using namespace 是邪恶的。从标题中删除它可以解决问题。
    猜你喜欢
    • 2011-05-02
    • 2014-07-03
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多