2010-10-22 14 views
24

J'essaie d'utiliser la bibliothèque de marshalling dans mon projet C++/CLI. Une fois compilé avec #include <msclr/marshal.h>, j'obtiens l'erreur error C2872: 'IServiceProvider' : ambiguous symbol. La plupart des résolutions semblent suggérer le déplacement #include <windows.h> comme celui ici ->Ambiguous references, mais je n'ai pas ceux inclut. Tout ce que j'ai est:Problème de compilation avec marshal.h: erreur C2872: 'IServiceProvider': symbole ambigu

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

Comment est-ce que je débogue ce problème?

Répondre

40

Vous le faites, indirectement, marshal.h l'inclut. Il déverse une énorme quantité d'identifiants dans l'espace de noms global. Les macros sont particulièrement gênantes, beaucoup d'entre elles correspondent aux noms utilisés dans le framework.

Beaucoup de choses que marshal.h fait peuvent aussi être faites par la classe Marshal. Mais je ne peux pas vous aider avec ça, vous n'avez pas mentionné pourquoi vous voulez l'utiliser. Vous pouvez résoudre ce contretemps notamment en mettant la directive #include avant les déclarations en utilisant:

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

Je suis en train de convertir String^à const char * – anivas

+4

Marshal :: StringToCoTaskMemAnsi + Marshal :: FreeCoTaskMem. –

+0

Peut également utiliser System :: String^pour éviter les utilisations dans l'en-tête – slater

2

Assurez-vous que vous avez seulement:

using namespace System; 

dans le fichier cpp du projet CLR et non dans l'en-tête. Visual Studio l'ajoute automatiquement à l'en-tête lors de la création d'un projet de bibliothèque de classe CLR. Dans le cpp lui-même, les includes doivent précéder "using namespace".

Questions connexes