Функція шаблону всередині класу шаблонів


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 )? Ви не можете перемістити функцію відхилення функції із заголовка, тому ...
hiobs

@hiobs: FWIW, ви можете перемістити декларацію у файл CPP. Це сказав, що я лише один раз це робив, щоб зробити хакерство. У цьому випадку важливо знати, як це зробити.
Томас Едінг

Іноді потрібно перенести визначення функції за межі класу, після визначення залежностей, необхідних тілу функції. Це відбувається, коли клас A використовує клас B, а B також використовує A. У цьому випадку ви оголошуєте A і B, а потім визначаєте методи A і B.
Wheezil

Відповіді:


180

Напишіть це:

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

недійсний MyClass <T> :: foo <T> () ... дякую, я раніше його пробував, але це не працює для мене .. можливо, мені довелося робити чистий проект.
Майкл

@ user1074367: Ні, я думаю, що це, як я кажу.
Керрек СБ

3
насправді я писав: шаблон <клас T> шаблон <клас U> void MyClass <T> :: foo () {U a; a.invoke (); } і це працює
Майкл

11
@ user1074367: Помилка ... так, це я кажу у відповіді, ні?
Керрек СБ

8
@mike: Шаблони учасників - абсолютно нормальна і звичайна річ.
Керрек СБ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.