none
Levée une ambiguïté RRS feed

  • Question

  • J'ai codé une instruction avec une ligne bien connue

    System::String^ NomDocument = gcnew((wchar_t *) wsFullPathName.c_str());
    Mais le compilateur s'est mélangé les pédales.
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(32): error C2872: 'System' : symbole ambigu
    1>          est peut-être 'System'
    1>          ou       'd:\program files\microsoft visual studio 10.0\visual studio tools for office\pia\office12\microsoft.office.interop.word.dll : Microsoft::Office::Interop::Word::System'

    Comment dire au compilateur que c'est bien une System::String


    Jean Noël Martin

    vendredi 27 juillet 2012 05:25

Réponses

  • j'ai compris que je pouvais écrire using namespase S = System;

    mais ça n'allège pas le code pour le reste le fait de faire la même chose avec using namespace word = ....

    résout le problème. 


    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 lundi 30 juillet 2012 13:13
    lundi 30 juillet 2012 13:13

Toutes les réponses

  • Pas cool cette collision de nom.

    Moi, le plus simple, c'est de faire un alias de Microsoft::Office::Interop::Word avec un

    namespace Word = Microsoft::Office::Interop::Word; 
    

    Vous supprimez le using de Microsoft::Office::Interop::Word.

    Et voila.

    Vous pouvez aussi supprimer "System::" devant String^, mais utiliser des alias cela permet de simplifier/clarifier le code.


    Paul Bacelar, Ex - MVP VC++

    vendredi 27 juillet 2012 10:41
    Modérateur
  • J'ai besoin d'un éclaircissement sur les alias; Pour le reste ça marche

    Jean Noël Martin

    vendredi 27 juillet 2012 14:58
  • namespace Word = Microsoft::Office::Interop::Word;

    C'est un alias du namespace Microsoft::Office::Interop::Word en "Word".

    Au lieu d'injecter tout les sous-namespaces et classe contenu dans le namespace Microsoft::Office::Interop::Word "sans nom", vous les injectez dans un pseudo-namespace "Word".

    Ainsi, le compilateur ne pourra confondre le namespace "::System" et la classe "Microsoft::Office::Interop::Word::System" car, pour accéder à cette classe, il faudra écrire "Word::System".


    Paul Bacelar, Ex - MVP VC++

    vendredi 27 juillet 2012 16:21
    Modérateur
  • namespace Word = Microsoft::Office::Interop::Word;

    C'est un alias du namespace Microsoft::Office::Interop::Word en "Word".

    Au lieu d'injecter tout les sous-namespaces et classe contenu dans le namespace Microsoft::Office::Interop::Word "sans nom", vous les injectez dans un pseudo-namespace "Word".

    Ainsi, le compilateur ne pourra confondre le namespace "::System" et la classe "Microsoft::Office::Interop::Word::System" car, pour accéder à cette classe, il faudra écrire "Word::System".


    Paul Bacelar, Ex - MVP VC++

    vendredi 27 juillet 2012 16:21
    Modérateur
  • Oui ça, ça marche mais vous avez parlé d'un alias pour la classe System::String et c'est celui là qui m'intéresse

    Jean Noël Martin

    vendredi 27 juillet 2012 17:58
  • j'ai compris que je pouvais écrire using namespase S = System;

    mais ça n'allège pas le code pour le reste le fait de faire la même chose avec using namespace word = ....

    résout le problème. 


    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 lundi 30 juillet 2012 13:13
    lundi 30 juillet 2012 13:13