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

C++ Discussion :

D�claration de fonction amie


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre r�gulier
    Homme Profil pro
    Ing�nieur de recherche
    Inscrit en
    Octobre 2014
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur de recherche
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Par d�faut D�claration de fonction amie
    Bonsoir,

    je cherche � d�clarer une fonction amie mais j'obtiens l'erreur suivante avec g++:
    In file included from main.cpp:2:0:
    vector.hpp: In instantiation of �example::Vector<example::sequential>�:
    main.cpp:11:40: instantiated from here
    vector.hpp:23:27: erreur: template-id �dot<>� for �PetscErrorCode example::dot(const example::Vector<example::sequential>&, const example::Vector<example::sequential>&, PetscScalar*)� does not match any template declaration
    J'ai beau relire mon code, je ne vois pas o� je commets une erreur.

    La fonction amie est d�clar�e dans une classe Vector
    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
    27
    28
    29
    30
    #ifndef VECTOR_HPP
    #define VECTOR_HPP
     
    #include <petscvec.h>
     
    // forward declaration of vector
    #include "vector_fwd.hpp"
     
     
     
    namespace example {
     
      // forward declaration of dot function
      template< template<class> class DistributionPolicy >
      PetscErrorCode dot(Vector<DistributionPolicy> const & x , Vector<DistributionPolicy> const & y , PetscScalar * val);
     
      template< template<class> class DistributionPolicy >
      class Vector : public DistributionPolicy<Vec>
      {
     
        friend PetscErrorCode dot<>(Vector<DistributionPolicy> const & x , Vector<DistributionPolicy> const & y , PetscScalar * val);
     
      private:
     
        Vec m_self;
     
      };
    }
     
    #include "vector_friend.hpp"
    et la fonction amie est d�finie par
    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
    #ifndef VECTOR_FRIEND_HPP
    #define VECTOR_FRIEND_HPP
     
     
    namespace example {
     
      template< template<class> class DistributionPolicy >
      inline PetscErrorCode dot(Vector<DistributionPolicy> const & x,
                                Vector<DistributionPolicy> const & y,
                                PetscScalar* val) {
        PetscErrorCode code = VecDot(x.m_self,y.m_self,val);
        CHKERRQ(code);
        return 0;
      }
     
    }
     
     
    #endif
    Est-ce que vous voyez o� se situe le probl�me?

  2. #2
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Ta fonction dot est une fonction template. Tu dois donc pr�venir le compilateur qu'il s'agit d'une fonction template, mais, pour ton malheur, cela ne fonctionnera qu'en C++11 et ult�rieur.

    Si tu as la possibilit� d'utiliser les fonctionnalit�s r�cemment ajout�es par la norme, tu devrais pouvoir d�finir une amiti� envers une fonction template sous la forme de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template <typename T>
    void foo(T const &t ){
        std::cout<<t.member_<<"\n";
    }
    template <typename T>
    class MaClass{
       template<typename U>
       friend void foo(U const &);
    public:
       MaClass(T const & t):member_(t){}
    private:
            T member_;
    };
    qui serait utilis�e sous une forme proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
        MaClass<int> testint(3);
        foo(testint);
        MaClass<std::string> testString("salut");
        foo(testString);
        return 0;
    }
    Si tu n'a pas l'occasion de profiter des bienfaits de C++11 ou ult�rieur, tu devras travailler � l'ancienne en cr�ant par exemple un foncteur, sous une forme proche de
    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
     
    template <typename T>
    void foo(T const &t ){
        std::cout<<t<<"\n";
    }
    struct Functor{
    template <typename T>
       void operator()(T const & t){
            foo(t.member_);
       }
    };
    template <typename T>
    class MaClass{
       friend class Functor;
    public:
       MaClass(T const & t):member_(t){}
    private:
            T member_;
    };
    qui sera utilis�e sous une forme proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(){
        MaClass<int> testint(3);
        Functor()(testint);
        MaClass<std::string> testString("salut");
        Functor()(testString);
        /* OU  OU  OU */
       Functor f;
       f(testint);
       f(testString);
        return 0;
    }
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  3. #3
    Membre r�gulier
    Homme Profil pro
    Ing�nieur de recherche
    Inscrit en
    Octobre 2014
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur de recherche
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Par d�faut
    Bonjour koala01,

    je te remercie pour ta r�ponse.

    Je ne peux malheureusement pas utiliser la nouvelle norme.
    La solution par foncteur que tu proposes est int�ressante mais je suis surpris qu'une solution plus directe ne soit pas possible.
    J'ai l'habitude de d�finir des fonctions template amies mais l� il y a quelque chose qui bloque et je ne vois pas quoi.

    Pour illustrer mon propos, voici une relation d'amiti� similaire qui compile et s'ex�cute sur ma machine, avec le m�me compilateur que pr�c�demment.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "foo.hpp"
    #include "nothing.hpp"
     
    int main()
    {
      example::Foo<nothing> foo;
      example::print(foo);
      return 0;
    }
    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
    #include "foo_fwd.hpp"
    #include "bar.hpp"
     
    namespace example
    {
     
      // forward declaration of print
      template< template<class> class Policy > 
      void print(Foo<Policy> const & foo);
     
      // definition of Foo
      template< template<class> class Policy >
      class Foo : public Policy<Bar>
      {
        friend void print<>(Foo<Policy> const & foo);
      };
     
    }
     
    #include "foo_friend.hpp"
     
    #endif
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef EXAMPLE_FOO_FRIEND_HPP
    #define EXAMPLE_FOO_FRIEND_HPP
     
    namespace example {
      // definition of print
      template< template<class> class Policy >
      void print(Foo<Policy> const & foo)
      { std::cout << "Hello!" << std::endl; }
    }
     
    #endif
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef EXAMPLE_NOTHING_HPP
    #define EXAMPLE_NOTHING_HPP
     
    #include "bar.hpp"
     
    template< class T >
    class nothing;
     
    template<>
    class nothing<Bar>
    {};
     
    #endif
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef EXAMPLE_BAR_HPP
    #define EXAMPLE_BAR_HPP
     
    class Bar
    {};
     
     
    #endif
    Merci beaucoup pour ton aide

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Hello tous les deux

    Il y a tout de m�me un d�tail dans le code de C�dric qui ne doit pas nous �chapper : l'argument template de dot n'est pas un type mais un template, on est dans donc dans un cas tricky de template template. Or d'apr�s ton message d'erreur, tu tentes de r�soudre le template avec example::sequential comme argument. Est-ce example::sequential est bien un template et pas un type compl�tement r�solu ? Dans l'exemple qui fonctionne, nothing est bien un template de la bonne forme donc �a fonctionne. Mais qu'en est-il de example::sequential ? Est-ce bien un template qui peut �tre r�solu dans ce cas ? On n'a pas vu le code donc on ne peut pas savoir.

    Tu n'as pas affaire � de l'amiti� templat�e ici puisque ton template est r�solu dans la d�claration d'amiti�. Les techniques de Koala sont parfaitement valables mais ne s'appliquent pas pour ton probl�me il me semble.

  5. #5
    Membre r�gulier
    Homme Profil pro
    Ing�nieur de recherche
    Inscrit en
    Octobre 2014
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur de recherche
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Par d�faut
    Bonjour jblecanard,

    merci pour ton intervention.

    Voici la classe sequential :
    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
    #ifndef SEQUENTIAL_HPP
    #define SEQUENTIAL_HPP
     
     
    namespace example {
     
      template< class T >
      struct sequential;
     
      template<>
      struct sequential<Vec>
      {
        static PetscErrorCode create(MPI_Comm comm,PetscInt n,Vec *v) { 
          PetscErrorCode code = VecCreateSeq(comm,n,v);
          CHKERRQ(code);
          return 0; 
        }
      };
    }
     
    #endif
    Il s'agit bien d'une classe template mais elle est totalement sp�cialis�e pour Vec.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Hello

    Je pense que le probl�me de vient pas de la d�claration d'amiti�, car en reproduisant le code que tu nous montres de la mani�re la plus proche que je puisse, il n'y a aucun probl�me:

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    class Vec
    {};
     
    typedef int PetscErrorCode;
    typedef int PetscScalar;
    typedef int MPI_Comm;
    typedef int PetscInt;
     
    namespace example
    {
    template< template<class> class Policy > class Vector;
     
    template< template<class> class DistributionPolicy >
    PetscErrorCode dot(Vector<DistributionPolicy> const & x , Vector<DistributionPolicy> const & y , PetscScalar * val);
     
     
    template< template<class> class DistributionPolicy > class Vector : public DistributionPolicy<Vec>
    {
      friend PetscErrorCode dot<>(Vector<DistributionPolicy> const & x , Vector<DistributionPolicy> const & y , PetscScalar * val);
     private:
      Vec m_self;
     
    };
     
    template< template<class> class DistributionPolicy >
      inline PetscErrorCode dot(Vector<DistributionPolicy> const & x,
          Vector<DistributionPolicy> const & y,
          PetscScalar* val) {
        return 0;
      }
     
    template< class T > struct sequential;
     
    template<> struct sequential<Vec> {
      static PetscErrorCode create(MPI_Comm comm,PetscInt n,Vec *v) {
        return 0;
      }
    };
    }
     
    int main() {
      example::Vector<example::sequential> vec1;
      example::Vector<example::sequential> vec2;
      example::dot(vec1, vec2, 0);
      return 0;
    }
    Compile sans souci sous gcc 4.7 en mode C++03, et j'ai copi�/coll� depuis le post, pas reproduit.

Discussions similaires

  1. fonctions amies
    Par Vips dans le forum C++
    R�ponses: 10
    Dernier message: 24/03/2006, 04h41
  2. fonctions amies
    Par hamma2 dans le forum C++
    R�ponses: 4
    Dernier message: 10/12/2005, 20h19
  3. [C++] Fonction amie vituelle dans une classe ?
    Par Bob.Killer dans le forum C++
    R�ponses: 11
    Dernier message: 04/12/2005, 13h42
  4. R�ponses: 6
    Dernier message: 20/11/2005, 02h53
  5. [JS] Probl�me d�claration de fonction
    Par glloq8 dans le forum G�n�ral JavaScript
    R�ponses: 5
    Dernier message: 23/09/2005, 10h22

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