Fonction de modèle dans la classe de modèle


119

J'ai ce code:

template <class T>
class MyClass {
    public:
        template <class U>
        void foo() {
            U a;
            a.invoke();
        }
};

Je le veux sous cette forme:

template <class T>
class MyClass {
    public:
        template <class U>
        void foo();
};

template <class T> /* ????? */
void MyClass<T>::foo() {
    U a;
    a.invoke();
}

Comment puis-je faire cela? Quelle est la bonne syntaxe?


Pourquoi ne pas simplement faire la fonction decl à l'intérieur de la classe decl (voir codepad.org/wxaZOMYW )? De toute façon, vous ne pouvez pas déplacer la fonction decl hors de l'en-tête, alors ...
hiobs

@hiobs: FWIW, vous pouvez déplacer la déclaration dans un fichier CPP. Cela dit, je n'ai fait cela qu'une seule fois pour faire du piratage. Dans ce cas, il est essentiel de savoir comment procéder.
Thomas Eding

Parfois, il faut déplacer la définition de fonction en dehors de la classe, après la définition des dépendances nécessaires au corps de la fonction. Cela se produit lorsque la classe A utilise la classe B et B utilise également A. Dans ce cas, vous déclarez A et B, puis définissez les méthodes A et B.
Wheezil

Réponses:


180

Écrire cela:

template <class T>
template <class U>
void MyClass<T>::foo() { /* ... */ }

void MyClass <T> :: foo <T> () ... merci, je l'ai essayé avant, mais cela ne fonctionne pas pour moi .. peut-être que je devais faire un projet propre.
Michael

@ user1074367: Non, je pense que c'est comme je l'ai dit.
Kerrek SB

3
en fait j'ai écrit: template <class T> template <class U> void MyClass <T> :: foo () {U a; a.invoke (); } et ça marche
Michael

11
@ user1074367: Euh ... oui, c'est ce que je dis dans la réponse, non?
Kerrek SB

8
@mike: Les modèles de membres sont une chose parfaitement normale et courante.
Kerrek SB
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.