2010-10-22 74 views
24

我正在尝试在我的C++/CLI项目中使用编组库。与#include <msclr/marshal.h>编译时,出现错误error C2872: 'IServiceProvider' : ambiguous symbol。大多数决议似乎建议移动#include <windows.h> 就像这里 - >Ambiguous references,但我没有那些包括。我所有的是:使用marshal.h编译问题:错误C2872:'IServiceProvider':模糊符号

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

如何调试此问题?

回答

40

你这样做,间接地,marshal.h包括它。它在全局命名空间中转储了大量的标识符。这些宏特别尴尬,它们中的很多与框架中使用的名称相匹配。

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

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

我想将String ^转换为const char * – anivas 2010-10-22 20:48:10

+4

Marshal :: StringToCoTaskMemAnsi + Marshal :: FreeCoTaskMem。 – 2010-10-22 23:15:48

+0

也可以使用System :: String ^来避免在标题中使用 – slater 2014-11-10 19:29:46

2

确保你只有:

using namespace System; 

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