Функция шаблона внутри класса шаблона

119

У меня есть такой код:

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

Я хочу это в такой форме:

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

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

Как я могу это сделать? Каков правильный синтаксис?

Майкл
источник
Почему бы просто не сделать функцию decl внутри класса decl (см. Codepad.org/wxaZOMYW )? В любом случае вы не можете переместить функцию decl из заголовка, поэтому ...
hiobs
@hiobs: FWIW, вы можете переместить объявление в файл CPP. Тем не менее, я сделал это только один раз, чтобы заняться хакерством. В этом случае важно знать, как это сделать.
Томас Эдинг
Иногда необходимо переместить определение функции за пределы класса после определения зависимостей, необходимых для тела функции. Это происходит, когда класс A использует класс B, а B также использует A. В этом случае вы объявляете A и B, а затем определяете методы A и B.
Wheezil

Ответы:

180

Напишите это:

template <class T>
template <class U>
void MyClass<T>::foo() { /* ... */ }
Керрек С.Б.
источник
void MyClass <T> :: foo <T> () ... спасибо, я пробовал раньше, но у меня это не работает ... возможно, мне пришлось сделать чистый проект.
Майкл
@ user1074367: Нет, думаю, все так, как я сказал.
Kerrek SB
3
собственно я написал: template <class T> template <class U> void MyClass <T> :: foo () {U a; a.invoke (); } и это работает
Майкл
11
@ user1074367: Эээ ... да, это то, что я говорю в ответ, нет?
Kerrek SB
8
@mike: Шаблоны участников - совершенно нормальное и обычное дело.
Kerrek SB