Função de modelo dentro da classe de modelo

119

Eu tenho este código:

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

Eu quero desta forma:

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

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

Como posso fazer isso? Qual é a sintaxe certa?

Michael
fonte
Por que não apenas fazer a função decl dentro da classe decl (consulte codepad.org/wxaZOMYW )? Você não pode mover a função decl para fora do cabeçalho de qualquer maneira, então ...
hiobs
@hiobs: FWIW, você pode mover a declaração para um arquivo CPP. Dito isso, só fiz isso uma vez para fazer um pouco de hackeagem. Nesse caso, saber fazer isso é essencial.
Thomas Eding
Às vezes, é necessário mover a definição da função para fora da classe, após a definição das dependências necessárias para o corpo da função. Isso acontece quando a classe A usa a classe B e B também usa A. Nesse caso, você declara A e B e define os métodos A e B.
Wheezil

Respostas:

180

Escreva isso:

template <class T>
template <class U>
void MyClass<T>::foo() { /* ... */ }
Kerrek SB
fonte
void MyClass <T> :: foo <T> () ... obrigado, eu tentei antes, mas não funciona para mim .. talvez eu tivesse que fazer um projeto limpo.
Michael
@ user1074367: Não, acho que é o que eu digo.
Kerrek SB
3
na verdade eu escrevi: template <classe T> template <classe U> void MyClass <T> :: foo () {U a; a.invoke (); } e funciona
Michael
11
@ user1074367: Err ... sim, é o que digo na resposta, não?
Kerrek SB
8
@mike: Modelos de membros são perfeitamente normais e comuns.
Kerrek SB