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?

Michael
la source
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() { /* ... */ }
Kerrek SB
la source
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