none
la bonne implémentation des operateurs RRS feed

  • Discussion générale

  • J'avance par petites touches,mais je ne suis pas au bout

    J'ai codé:

    la ligne d'affectation:

    (SensDictionnary^)this = (System::String^)gcnew String( s);

    la primitive operator:

        SensDictionnary^ operator = ( System::String^ dict)
        { // 1
            *this = dict;
            return( this);
        } // 1

    pour avoir une définition du symbole = mais ça n'a rien changé bien que la primitive ne  compile pas toujours:

    1>..\..\..\..\Utility\Dictionnaire\src\Dictionnaire.cpp(165): error C2801: 'SpecificationLoader::operator =' doit être un membre non static
    1>..\..\..\..\Utility\Dictionnaire\src\Dictionnaire.cpp(166): error C2355: 'this' : ne peut être référencé qu'à l'intérieur de fonctions membres non static
    1>..\..\..\..\Utility\Dictionnaire\src\Dictionnaire.cpp(167): error C2355: 'this' : ne peut être référencé qu'à l'intérieur de fonctions membres non static

    je ne sais pas pourquoi il voit la primitive comme static. Elle n'a jamais été déclaré comme telle

    Je vous met la déclaration:

        ref class  SensDictionnary
        { // 1// ligne 22
        public://ligne 23
            static System::Collections::Generic::List <Microsoft::VisualC::StlClr::GenericPair<System::String^, SpecificationLoader::mySynset^>^>^ sens; //ligne 25
            SensDictionnary::SensDictionnary();
            SensDictionnary::~SensDictionnary();
            static bool SensDictionnary::isKnown( System::String^ word);
            static void SensDictionnary::reset();
            static void SensDictionnary::LoadDictionnary( char* FileName);
            static int SensDictionnary::SaveSens( char*);
            static mySynset^ SensDictionnary::getSens( System::String^);
            static bool SensDictionnary::addSens( System::String^, mySynset^);
            static void SensDictionnary::updateSens( System::String^ word, mySynset^ pSynset);
            static void SensDictionnary::remove( System::String^);
            static System::String^ SensDictionnary::toString();
            static System::String^ SensDictionnary::keyListString();
            SensDictionnary^ operator = ( System::String^ dict);
        }; // 1 ligne 38
    le message d'erreur à beau être explicite, il ne reconnait pas la primitive
    1>..\..\..\..\Utility\Dictionnaire\src\Dictionnaire.cpp(58): error C2440: '=' : impossible de convertir de 'System::String ^' en 'SpecificationLoader::SensDictionnary ^'
    1>          Aucun opérateur de conversion défini par l'utilisateur disponible, ou
    1>          Les types pointés n'ont aucun rapport entre eux ; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction



    Jean Noël Martin


    Jean Noël Martin





    mercredi 23 septembre 2015 08:41

Toutes les réponses

  • Pourquoi faire plusieurs sujets sur le même problème ???

    https://social.msdn.microsoft.com/Forums/fr-FR/e1fb8ad7-a2cb-45b8-a120-9982be95f8fa/conversion-de-donnes?forum=visualcplusfr

    >je ne sais pas pourquoi il voit la primitive comme static

    Cf. la documentation (et en particulier l'exemple, avec le premier cas d'erreur)https://msdn.microsoft.com/en-us/library/k4fyzf6a.aspx?f=255&MSPPError=-2147217396

    Dans ce cas, il faut comprendre par non membre, votre fonction est une fonction libre donc non membre.

    Le message d'erreur vous indique que vous ne pouvez pas redéfinir un opérateur "=" comme fonction libre, ce qui est logique si vous prenez la peine de lire les références que j'ai déjà données dans la file de message initiale.

    Tout votre code est un non-sens, lisez ces putai** de références.


    Paul Bacelar, Ex - MVP VC++

    mercredi 23 septembre 2015 14:13
    Modérateur
  • Donc on ne saurait définir l'opérateur =, ce qui est contraire aux exemples nombreux trouvés sur des sites et nottament celui ci.

    Et cependant tout ça ne nous rapproche pas de la solution

    j'ai repris le code en supprimant l'opérateur =

    j'ai donc le code:

    	void SensDictionnary::LoadDictionnary( char* FileName)
    	{ // 1
    		std::ifstream read;
    		
    		read.open(FileName);
    		read >> (*this);
    		read.close();
    	} // 1
    qui génère le message suivant:

    1>..\..\..\..\Utility\Dictionnaire\src\Dictionnaire.cpp(56): error C2678: '>>' binaire : aucun opérateur trouvé qui accepte un opérande de partie gauche de type 'std::ifstream' (ou il n'existe pas de conversion acceptable)
    1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\istream(1053): peut être 'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &&,signed char *)'
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>
    1>          ]
    1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\istream(1060): ou       'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &&,signed char &)'
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>
    1>          ]



    Jean Noël Martin


    • Modifié JeanNoel53 mercredi 23 septembre 2015 15:27
    mercredi 23 septembre 2015 14:47
  • C'est texto dans la référence que vous donnez :

    "You can implement C++ operator overloads by providing special member-functions "

    C'est en GRAS SOULIGNE ITALIQUE !!!

    >Et cependant tout ca ne nous rapproche pas de la solution

    On n'y arrivera pas si vous ne lisez pas les références que je vous fournis.

    Vous pouvez chercher toutes les références que vous voulez, si elles sont correctes, et QUE VOUS LES LISIEZ ATTENTIVEMENT, on arrivera toujours au même.

    lisez ces putai** de références.(BIS)


    Paul Bacelar, Ex - MVP VC++

    mercredi 23 septembre 2015 15:21
    Modérateur
  • j'ai mis ci dessus l'implémentation actuelle

    Je rajoute les deux primitives libre

    	ostream& operator << (ostream& s, SensDictionnary^ dict)
    	{ // 1
    		return (s << dict->toString());
    	} // 2
    //------------------------------------------------------------------------------
    	istream& operator >> (istream& read, SensDictionnary^ dict)
    	{
    		char BufLine[600];
    		char* pTerm;
    		System::String^ word;
    		mySynset^ syns;
    		int Len;
    		int iNumFormula;
    		int iNumEntity;
    		int iNumVirtualEquation;
    		Microsoft::VisualC::StlClr::GenericPair<System::String^, SpecificationLoader::mySynset^>^ el;
    
    		iNumFormula = 0;
    		iNumEntity = 0;
    		iNumVirtualEquation = 0;
    		while( read.good())
    		{ // 2
    			read.getline(BufLine, 600);
    			pTerm = strtok( BufLine, "\t");
    			if(pTerm != NULL)
    			{ // 3
    				wchar_t* temp = CStrConv::ambstowcs( pTerm);
    				word = gcnew String( temp);
    				CStrConv::StrFreeW(temp);
    				pTerm =strtok( NULL, "\t");
    				syns->Number = atoi( pTerm);
    				pTerm = strtok( NULL, "\t");
    				syns->Frequence = atoi( pTerm);
    				pTerm =strtok( NULL, "\t");
    				if (pTerm == NULL)
    					syns->Identifier = 0;
    				else
    					syns->Identifier = atoi( pTerm);
    				pTerm =strtok( NULL, "\t");
    				if (pTerm == NULL)
    					syns->pos = 0;
    				else
    					syns->pos = atoi( pTerm);
    				if (syns->pos == 7)
    					iNumFormula++;
    				if (syns->pos == 8)
    					iNumEntity++;
    				if (syns->pos == 17)
    					iNumVirtualEquation++;
    				pTerm =strtok( NULL, "\t");
    				syns->Value = atof( pTerm);
    				pTerm =strtok( NULL, "\t");
    				if( pTerm != NULL)
    				{ // 4
    					wchar_t* temp = CStrConv::ambstowcs( pTerm);
    					syns->Word = gcnew String( temp);
    					CStrConv::StrFreeW( temp);
    					pTerm = strtok( NULL, "\t");
    					temp = CStrConv::ambstowcs( pTerm);
    					syns->Word = gcnew String( temp);
    					syns->Definition = gcnew String( temp);
    					CStrConv::StrFreeW( temp);
    					el->first = word;
    					el->second = syns;
    					dict->Add( el);
    				} // 4
    			} // 3
    		} // 2
    		return read;
    	}// 1


    Jean Noël Martin


    • Modifié JeanNoel53 mercredi 23 septembre 2015 15:58
    mercredi 23 septembre 2015 15:28
  • Ce tread est toujours d'actualité

    Jean Noël Martin

    vendredi 25 septembre 2015 15:01
  • Et c'est quoi la question ?

    Paul Bacelar, Ex - MVP VC++

    samedi 26 septembre 2015 23:29
    Modérateur
  • Je n'arrive pas a compiler le fichier Dictionnaire, avec les éléments suivants:

    1>..\..\..\..\Utility\Dictionnaire\src\Dictionnaire.cpp(54): error C2678: '>>' binaire : aucun opérateur trouvé qui accepte un opérande de partie gauche de type 'std::ifstream' (ou il n'existe pas de conversion acceptable) 1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\istream(1053): peut être 'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &&,signed char *)' 1> with 1> [ 1> _Elem=char, 1> _Traits=std::char_traits<char> 1> ] 1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\istream(1060): ou 'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &&,signed char &)' 1> with 1> [ 1> _Elem=char, 1> _Traits=std::char_traits<char> 1> ] 1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\istream(1067): ou 'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &&,unsigned char *)' 1> with 1> [ 1> _Elem=char, 1> _Traits=std::char_traits<char> 1> ] 1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\istream(1074): ou 'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &&,unsigned char &)' 1> with 1> [ 1> _Elem=char, 1> _Traits=std::char_traits<char> 1> ]

    1>..\..\..\..\Utility\Dictionnaire\src\Dictionnaire.cpp(66): error C2679: '<<' binaire : aucun opérateur trouvé qui accepte un opérande de partie droite de type 'SpecificationLoader::SensDictionnary' (ou il n'existe pas de conversion acceptable)
    1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(679): peut être 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)'
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>
    1>          ]
    1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(726): ou       'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)'
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>
    1>          ]
    1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(764): ou       'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)'
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>
    1>          ]

    1>..\..\..\..\Utility\Dictionnaire\src\Dictionnaire.cpp(161): error C2679: '<<' binaire : aucun opérateur trouvé qui accepte un opérande de partie droite de type 'System::String ^' (ou il n'existe pas de conversion acceptable)
    1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(679): peut être 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)' [trouvé à l'aide d'une recherche dépendante d'un argument]
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>
    1>          ]
    1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(726): ou       'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)' [trouvé à l'aide d'une recherche dépendante d'un argument]
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>
    1>          ]
    1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(764): ou       'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)' [trouvé à l'aide d'une recherche dépendante d'un argument]
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>
    1>          ]

    1>..\..\..\..\Utility\Dictionnaire\src\Dictionnaire.cpp(223): error C2039: 'Add' : n'est pas membre de 'SpecificationLoader::SensDictionnary'



    Jean Noël Martin




    • Modifié JeanNoel53 lundi 28 septembre 2015 07:42
    dimanche 27 septembre 2015 07:33
  • J'ai passé le code en commentaire pour compiler cette classe. Je ne suis pas sur qu'elle soit utilisé et j'ai mis des points d'arrets pour le savoir

    Jean Noël Martin

    mardi 29 septembre 2015 10:15
  • Pouvez-vous nous fournir un projet minimum reproduisant le problème ?

    Paul Bacelar, Ex - MVP VC++

    mardi 29 septembre 2015 14:05
    Modérateur
  • J'ai une difficulté pour mon projet minimum

    J'ai une incompatibilité des options et je ne sais pas ce qu'il faut prendre comme option clr, c'est sur ZI c'est pas sur et Gm ça ne marche pas

    1>cl : Ligne de commande error D8016: options de ligne de commande '/clr' et '/Gm' non compatibles
    


    Jean Noël Martin

    mercredi 30 septembre 2015 10:15
  • Google est notre ami :

    http://blogs.msdn.com/b/calvin_hsia/archive/2013/08/30/10445552.aspx


    Paul Bacelar, Ex - MVP VC++

    mercredi 30 septembre 2015 17:21
    Modérateur
  • J'ai suivi pas a pas la procédure que vous m'avez indiqué; Je n'ai pas de fichier CppClr.vcxproj.mais mon projet s'appelle Test

    et dans mon fichier vcxproj j'ai :

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    </Project>

    ça ressemble que de loin à l'exemple.pouvez vous me confirmer que c'est le bon fichier


    Jean Noël Martin


    jeudi 1 octobre 2015 09:37
  • Si vous n'avez que ça dans votre .vcxproj, c'est mal barré, avez vous au moins ajouter des fichiers et un configuration Debug et Release ?

    Paul Bacelar, Ex - MVP VC++

    jeudi 1 octobre 2015 18:21
    Modérateur
  • Je n'ai rien dans debug ou dans release qui ressemble peu ou prou a vxproj.

    Jean Noël Martin

    vendredi 2 octobre 2015 13:23
  • .vcxproj, c'est le fichier projet, il n'a strictement rien à faire dans Debug ou Release !!!

    C'est dans le projet, pas dans les résultats de compilation.


    Paul Bacelar, Ex - MVP VC++

    vendredi 2 octobre 2015 17:30
    Modérateur