IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres éditeurs Discussion :

(novice) problème avec le compilateur gcc quand je passe de c++-4.0.1 vers c++-4.2.4


Sujet :

Autres éditeurs

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 24
    Points
    24
    Par défaut (novice) problème avec le compilateur gcc quand je passe de c++-4.0.1 vers c++-4.2.4
    Bonjour,

    Voilà un petit code que je peux compiler avec c++4.0.1 de gcc mais pas avec la version
    c++-4.2.4 (que je viens d'installer ...).
    Avec cette dernière version j'ai le message d'erreur suivant:

    test_namespace.cpp:15: erreur: specialization of 'T my_namespace::my_struct<T>::get_val() [with T = double]' in different namespace
    test_namespace.cpp:15: erreur: from definition of 'T my_namespace::my_struct<T>::get_val() [with T = double]'
    test_namespace.cpp:16: erreur: specialization of 'T my_namespace::my_struct<T>::get_val() [with T = float]' in different namespace
    test_namespace.cpp:16: erreur: from definition of 'T my_namespace::my_struct<T>::get_val() [with T = float]'
    test_namespace.cpp:18: erreur: specialization of 'void my_namespace::my_struct<T>::set_val(T) [with T = double]' in different namespace
    test_namespace.cpp:18: erreur: from definition of 'void my_namespace::my_struct<T>::set_val(T) [with T = double]'
    test_namespace.cpp:19: erreur: specialization of 'void my_namespace::my_struct<T>::set_val(T) [with T = float]' in different namespace
    Le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include <iostream> 
     
    namespace my_namespace
    {
    	template <class T>
    	struct my_struct 
    	{
    		public:
    		T val;
    		T get_val();
    		void set_val(T x);
    	};
    }
     
    template<> double my_namespace::my_struct<double>::get_val(){return val;}
    template<> float  my_namespace::my_struct<float>::get_val() {return val;}
     
    template<> void my_namespace::my_struct<double>::set_val(double x){ val=x;}
    template<> void my_namespace::my_struct<float>::set_val(float x) { val=x;}
     
    int main()
    {
    	my_namespace::my_struct<double> toto;
    	toto.set_val(10.);
    	std::cout << toto.get_val() << "\n";
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include <iostream> 
     
    namespace my_namespace
    {
    	template <class T>
    	struct my_struct 
    	{
    		public:
    		T val;
    		T get_val();
    		void set_val(T x);
    	};
    }
     
    template<> double my_namespace::my_struct<double>::get_val(){return val;}
    template<> float  my_namespace::my_struct<float>::get_val() {return val;}
     
    template<> void my_namespace::my_struct<double>::set_val(double x){ val=x;}
    template<> void my_namespace::my_struct<float>::set_val(float x) { val=x;}
     
    int main()
    {
    	my_namespace::my_struct<double> toto;
    	toto.set_val(10.);
    	std::cout << toto.get_val() << "\n";
    }
    Je ne suis pas assez bon pour comprendre ce qui se passe.
    Ce que j'ai remarqué c'est que ca marche avec la version 4.2.4 du compilateur si
    je fais les spécialisations dans "namespace my_namespace{ ... }.
    Si quelqu'un pouvait m'aider ?
    Merci.
    Cordialement,
    Michel

    Message edite par Aurelien, merci d'utiliser les balises CODE et QUOTE

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Citation Envoyé par micheldup Voir le message
    test_namespace.cpp:19: erreur: specialization of 'void my_namespace::my_struct<T>::set_val(T) [with T = float]' in different namespace

    Ce que j'ai remarqué c'est que ca marche avec la version 4.2.4 du compilateur si
    je fais les spécialisations dans "namespace my_namespace{ ... }.
    Je crois que tu as résolu toi-même ton problème, non ? Et le message du compilateur est assez clair.

    Voici ce que dit la norme (ISO14882)
    Partial specialization declarations themselves are not found by name lookup.
    Je ne suis pas sûr de moi mais je crois que c'est en rapport avec ton problème. Au fur et à mesure des versions, gcc est de plus en plus restrictif et proche de la norme, ce qui expliquerait pourquoi ce code ne compile plus avec une version récente.

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    La specialisation partielle c'est autre chose

    Tu declares tes templates dans un namespace, il faut les definir de la meme facon, dans un namespace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace my_namespace
    {
    template<> double my_struct<double>::get_val(){return val;}
    template<> float  my_struct<float>::get_val() {return val;}
     
    template<> void my_struct<double>::set_val(double x){ val=x;}
    template<> void my_struct<float>::set_val(float x) { val=x;}
    }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Bonjour et merci pour ces réponses.

    Effectivement comme ça ça marche avec la version 4.2.4 du compilateur.
    Malheureusement j'ai d'autres problèmes de compilation, plus surprenants.

    J'ai le sentiment que l'installation d'une version "locale" du compilateur est plus
    compliquée que je ne le pensais.

    Je vais détailler ce que j'ai fait, peut etre quelqu'un pourra me dire ce qui ne va pas.

    1- Version 4.2.4 téléchargée depuis gcc.gnu.org

    2- je crée l'arborescence:

    ..../Mes_Programmes/gmp-4.2.2/gmp-4.2.2
    ...//Mes_Programmes/gmp-4.2.2/gmp-4.2.2_build
    .../Mes_Programmes/gmp-4.2.2/gmp-4.2.2_install

    Je mets dans tous les fichiers d'installation dans gmp-4.2.2.
    Depuis gmp-4.2.2_build, je lance config:

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Je viens à peine de me rendre compte que le précédent message que j'ai
    envoyé n'était pas complet (j'ai du mal faire mon copié-colle).
    Voila donc la suite:

    Je mets tous les fichiers d'installation dans gmp-4.2.2.
    Depuis gmp-4.2.2_build, je lance config:

    > ../gcc-4.2.4/configure --prefix=/home/Michel/Mes_Programmes/gcc-4.2.4/gcc-4.2.4_install --program-suffix=-4.2.4 --with-local-prefix=/home/Michel/Mes_Programmes/gcc-4.2.4/gcc-4.2.4_install --enable-shared --enable-threads --enable-threads=posix --enable-languages=c++

    Ensuite je lance:

    > make
    > make install

    Finalement je modifie les variables PATH et LD_LIBRARY_PATH

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Je ne pense pas que beaucoup de monde puisse t'aider. Il y a cet article cela dit:
    http://philippe-dunski.developpez.com/compiler_gcc/

Discussions similaires

  1. Problème avec le compilateur gcc
    Par aminos40 dans le forum Debian
    Réponses: 2
    Dernier message: 17/04/2009, 15h59
  2. [KUBUNTU] Problème avec le compilateur GCC
    Par benjamin1985 dans le forum Ubuntu
    Réponses: 14
    Dernier message: 02/05/2007, 10h18
  3. [KUBUNTU] Problème avec le compilateur gcc
    Par kitsune dans le forum Ubuntu
    Réponses: 3
    Dernier message: 13/02/2006, 13h44
  4. [Novice] Problème avec Eclipse 3.0.x qui plante
    Par esolarc dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 27/05/2005, 13h22
  5. Inserer de l'assembleur en c avec le compilateur gcc
    Par KORTA dans le forum Autres éditeurs
    Réponses: 9
    Dernier message: 20/08/2003, 03h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo