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

Langage C++ Discussion :

[Template] Spécialisation partielle d'un template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut [Template] Spécialisation partielle d'un template
    Bonjour, je suis en train d'essayer de faire une spécialisation partielle d'un constructeur: je veux qu'il puisse être défini dans le template pour être d'un type ou de void.

    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
     
    namespace kage
    {
    	//!     \template       InstanceOf
    	//!     @brief          instance of a definition
    	template< class _Self, class _Definition, class _Base = KAGE_EMPTY<_Self>, typename _Param = void, class _DefPtr = KAGE_WP(_Definition) >
    	class	InstanceOf : public _Base
    	{
    		_DefPtr		_definition;
    	public:
    		friend class _Definition;
    		_DefPtr		getDefinition()		{	return _definition;	}
    	protected:
    		InstanceOf(_Param p);
    	public:
    		virtual ~InstanceOf()	{}
    	};
     
    } //namespace kage
    Voilà, pour le constructeur, je dois appeler le constructeur parent, qui lui peut ou ne pas avoir un paramètre. Evidemment, un paramètre void nommé, ca ne fonctionne pas, donc je dois spécialiser le template pour accepter aussi les paramètres void.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    template< class _Self, class _Definition, class _Base, typename _Param, class _DefPtr >
    kage::InstanceOf< _Self, _Definition, _Base, _Param, _DefPtr>::InstanceOf(_Param p) :
    	_Base(p)			
    	{
    	}
     
    template< class _Self, class _Definition, class _Base, class _DefPtr >
    kage::InstanceOf< _Self, _Definition, _Base, void, _DefPtr>::InstanceOf(void) :
    	_Base()			
    	{
    	}
    Autant dire que si je poste ca ici, c'est que ca ne fonctionne pas. D'où mes questions: est-ce que ce que je veux faire est possible? si oui, quelle serait la syntaxe ou la facon correcte de s'y prendre? Sinon, ben quelles autres solutions y-a-t'il ?

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    De mémoire, il me semble qu'on ne peut spécifier partiellement une méthode. Seule une classe peut être spécifiée partiellement.

  3. #3
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    Pourtant, je viens de tester en petit, ce truc fonctionne:
    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
     
    template<typename _param>
    class PTest
    {
    public:
    	PTest(_param);
    };
     
    template<>
    PTest<void>::PTest(void)
    {}
     
    template<>
    PTest<int>::PTest(int p)
    {p;}
     
    void mtest()
    {
    	PTest<void> vPtest;
    	PTest<int>	iPtest(3);
     
    }
    Ce qui voudrait dire que je dois spécialiser le constructeur du template pour chaque type de paramètre. Or, dans le cas concret, ca ne fonctionne pas en définissant ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    template< class _Definition, class _Base, class _DefPtr >
    kage::InstanceOf< _Definition, _Base, GLenum, _DefPtr>::InstanceOf(GLenum p) :
    	_Base(p)			
    	{
    	}
     
    template< class _Definition, class _Base, class _DefPtr >
    kage::InstanceOf< _Definition, _Base, void, _DefPtr>::InstanceOf(void) :
    	_Base()			
    	{
    	}

  4. #4
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    Je reprends mon exemple:
    ceci fonctionne
    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
    template<typename _param>
    class PTest
    {
    public:
    	PTest(_param);
    };
     
    template<>
    PTest<void>::PTest(void)
    {
    	std::cout << "void param" << std::endl;
    }
     
    template<typename _T>
    PTest<_T>::PTest(_T p)
    {
    	std::cout << typeid(_T).name() << " param " << p << std::endl;
    }
     
     
    void mtest()
    {
    	PTest<void>	vPtest;
    	PTest<int>	iPtest(3);
     
    }
    alors que ceci ne fonctionne pas:
    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
    template<class _Base, typename _P>
    class AnotherTest : public _Base
    {
    public:
    	typedef _Base Parent;
    	AnotherTest(_P);
    };
     
    template<class _B>
    AnotherTest<_B, void>::AnotherTest(void):
    	Parent()
    {
    	std::cout << "base class: " << typeid(_B).name() << std::endl;
    	std::cout << "param: void" << std::endl;
    }
     
    template<class _B, typename _X>
    AnotherTest<_B, _X>::AnotherTest(_X x):
    	Parent(x)
    {
    	std::cout << "base class: " << typeid(_B).name() << std::endl;
    	std::cout << "param: " << typeid(_X).name() << x << std::endl;
    }
     
    class Foo
    {
    public:
    	Foo(){}
    };
     
    class Bar
    {
    	int i;
    public:
    	Bar(int _i):i(_i){}
    };
     
    void atest()
    {
    	AnotherTest<Foo, void>	vATest;
    	AnotherTest<Bar, int>	vBTest(4);
    }
    Quelqu'un pourrait m'expliquer les raisons de cette erreur de compilation?
    (Sous VC, c'est "error C2244: 'AnotherTest<_Base,_P>::AnotherTest': unable to match function definition to an existing declaration" )

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Dans le premier cas, tu fais une spécialisation totale (OK) et dans le second une partielle (NOK). Je pense que c'est ça.

  6. #6
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    OK (ou plutôt NOK). Si ca ne marche, quels sont donc mes alternatives?
    Faire une spécialisation totale de mon cas d'utilisation?
    Est-ce qu'il y a une autre facon de s'y prendre à la spécialisation partielle?

    EDIT: Ca marche (bien sûr) avec une spécialisation totale, mais ce serait intéressent d'avoir une facon de s'y prendre pour les spécialisations partielles.

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/07/2012, 10h20
  2. Template spécialisation partielle
    Par saladin04 dans le forum Langage
    Réponses: 6
    Dernier message: 06/03/2011, 20h59
  3. [Template] spécialisation partielle des template
    Par vikki dans le forum Langage
    Réponses: 9
    Dernier message: 10/11/2008, 16h29
  4. Réponses: 4
    Dernier message: 15/10/2008, 09h33
  5. Réponses: 4
    Dernier message: 04/09/2008, 10h58

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