none
Le problème de dictionnaire est toujours là RRS feed

  • Question

  • bonjours C'est le dernier problème de compilation de ma migration

    je vous met l'include:

    #ifndef _DICTIONNAIRE_H
    #define _DICTIONNAIRE_H
    //------------------------------------------------------------------------------
    //------------------------------------------------------------------------------
    //------------------------------------------------------------------------------
    //------------------------------------------------------------------------------
    namespace SpecificationLoader
    { // 0 ligne 8
        using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Collections::Generic;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::IO;
    	using namespace std;
    //ligne 18
    
    
    	ref class  SensDictionnary
    // ligne 22
    	{ // 1
    	public:
            cliext::hash_map< System::String^, mySynset^> sens; //ligne 25
            SensDictionnary();
            ~SensDictionnary();
            SensDictionnary( char*);
            bool isKnown( System::String^);
            void reset();
            int SaveSens( char*);
            mySynset getSens( System::String^);
            bool addSens( System::String^, mySynset^);
            void updateSens( System::String^, mySynset^);
            void remove( System::String^);
            System::String^ toString();
            System::String^ keyListString();
    	}; // 1
    // ligne 39
    	ref class  SensTemporary
    	{ // 1
    	private:
            cliext::hash_map< int, mySynset^> sens;
    	public:
            SensTemporary();
            ~SensTemporary();
    // ligne 47
    		mySynset getSens( int);
            void remove( int);
            void updateSens( int, mySynset^);
            bool addSens( int, mySynset^);
            bool isExist( int);
    	}; // 1
    	//------------------------------------------------------------------------------
    }; // 0
    #endif

    je vous met les méthodes :

    SensDictionnary::SensDictionnary( char* FileName) : sens()
    {
       std::ifstream read;
       read.open( FileName);
       read >> (*this);
       read.close();
    }
    
    //------------------------------------------------------------------------------
    int SensDictionnary::SaveSens( char *filename)
    {
       std::ofstream write;
    
       write.open(filename);
       if(!write.fail())
       {
          write << (*this);
          write.close();
          return(0);
       }
       else
          return( -1);
    }

    et les messages d'erreurs :

    1>L:\usr\Verify\Memoria\dev\Utility\Dictionnaire\src\Dictionnaire.cpp(63): 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(192): ou       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::ios_base &(__cdecl *)(std::ios_base &))'
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>
    1>          ] 1>L:\usr\Verify\Memoria\dev\Utility\Dictionnaire\src\Dictionnaire.cpp(75): 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> ]



    Jean Noël Martin



    • Type modifié JeanNoel53 samedi 25 juillet 2015 16:02
    • Modifié JeanNoel53 dimanche 26 juillet 2015 00:24
    samedi 25 juillet 2015 16:01

Réponses

  • Si "operator <<" et "operator >>" sont des méthodes, elles n'acceptent qu'un paramètre, l'opérande gauche étant toujours le this de l'objet.

    Si "operator <<" et "operator >>" sont des fonctions libres, elles n'acceptent que deux opérandes, pas un.

    Je ne comprend pas pourquoi vous vous enquiquiner avec des std::istream du C++98 alors que les mécanismes de désérialisation .NET sont bien plus puissants.(BIS)


    Paul Bacelar, Ex - MVP VC++

    lundi 27 juillet 2015 15:14
    Modérateur

Toutes les réponses

  • Je ne vois pas de déclaration de l'opérateur >> vers un SensDictionnary, moi non plus, comme le compilateur.

    Vous attendez quoi pour l'implémenter ?


    Paul Bacelar, Ex - MVP VC++

    samedi 25 juillet 2015 20:01
    Modérateur
  • Je ne sais pas comment faire?

    Jean Noël Martin

    dimanche 26 juillet 2015 00:24
  • Euh, faut revoir ses cours, là.

    http://www.learncpp.com/cpp-tutorial/93-overloading-the-io-operators/


    Paul Bacelar, Ex - MVP VC++

    dimanche 26 juillet 2015 10:01
    Modérateur
  • à partir du lien j'ai essayé

                    write << char* << endl;
    		read >> char*;

    que le compilateur n'aime pas.

    J'ai aussi essayé

                    friend ostream& operator <<(ostream& out, char*);
    		friend istream& operator >>(istream&, char*);
    		

    et le compilateur m'a répondu

    >D:\usr\Specification LoaderV4.1\dev\Utility\com\Dictionnaire.h(25): error C3809: 'SpecificationLoader::SensDictionnary' : un type managé ne peut pas avoir de fonctions/classes/interfaces friend
    1>D:\usr\Specification LoaderV4.1\dev\Utility\com\Dictionnaire.h(26): error C3809: 'SpecificationLoader::SensDictionnary' : un type managé ne peut pas avoir de fonctions/classes/interfaces friend

    J'ai donc corrigé l'operator :

    		ostream& operator <<(ostream& out, *this);
    		istream& operator >>(istream&, *this);
    

    Et le compilateur m'a répondu

    1>D:\usr\Specification LoaderV4.1\dev\Utility\com\Dictionnaire.h(25): error C2059: erreur de syntaxe : '*'
    1>D:\usr\Specification LoaderV4.1\dev\Utility\com\Dictionnaire.h(26): error C2059: erreur de syntaxe : '*'
    1>L:\usr\Verify\Memoria\dev\Utility\Dictionnaire\src\Dictionnaire.cpp(63): 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>          ]

    Dans quelle direction dois je aller


    Jean Noël Martin



    dimanche 26 juillet 2015 21:35
  • this n'a de sens que dans le corps d'une méthode, non static, d'une classe.

    Jamais dans la signature d'une fonction.

    >Dans quelle direction dois je aller

    Bin, moi, j'en sais rien, je ne fais que vous dire pourquoi le compilateur n'aime pas cela.

    Je ne comprend pas pourquoi vous vous enquiquiner avec des std::istream du C++98 alors que les mécanismes de désérialisation .NET sont bien plus puissants.


    Paul Bacelar, Ex - MVP VC++

    lundi 27 juillet 2015 09:47
    Modérateur
  • J'ai donc corrigé:

    J'ai  mis

    		ostream& operator <<(ostream& out, char*);
    		istream& operator >>(istream&, char*);
    

    et le compilateur m'a répondu

    1>D:\usr\Specification LoaderV4.1\dev\Utility\com\Dictionnaire.h(25): error C2804: trop de paramètres pour l'opérateur binaire 'operator <<'
    1>D:\usr\Specification LoaderV4.1\dev\Utility\com\Dictionnaire.h(26): error C2804: trop de paramètres pour l'opérateur binaire 'operator >>'
    1>L:\usr\Verify\Memoria\dev\Utility\Dictionnaire\src\Dictionnaire.cpp(63): 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>          ]



    Jean Noël Martin

    lundi 27 juillet 2015 13:49
  • Si "operator <<" et "operator >>" sont des méthodes, elles n'acceptent qu'un paramètre, l'opérande gauche étant toujours le this de l'objet.

    Si "operator <<" et "operator >>" sont des fonctions libres, elles n'acceptent que deux opérandes, pas un.

    Je ne comprend pas pourquoi vous vous enquiquiner avec des std::istream du C++98 alors que les mécanismes de désérialisation .NET sont bien plus puissants.(BIS)


    Paul Bacelar, Ex - MVP VC++

    lundi 27 juillet 2015 15:14
    Modérateur
  • Je vis passer avec CWfStream

    Jean Noël Martin

    lundi 27 juillet 2015 18:32