模板类中的模板函数


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 2011年

@hiobs:FWIW,您可以将声明移到CPP文件中。也就是说,我只做过一次黑客操作。在这种情况下,知道如何执行此操作至关重要。
Thomas Eding

有时,在定义函数主体所需的依赖项之后,必须将函数定义移出类。当类A使用类B而B也使用A时,会发生这种情况。在这种情况下,您声明A和B,然后定义A和B方法。
Wheezil'1

Answers:


180

这样写:

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

void MyClass <T> :: foo <T>()...谢谢,我之前尝试过,但是对我不起作用..也许我必须做干净的项目。
迈克尔

@ user1074367:不,我认为是我所说的。
Kerrek SB 2011年

3
实际上我写过:template <class T> template <class U> void MyClass <T> :: foo(){U a; a.invoke(); }并且有效
Michael

11
@ user1074367:嗯...是的,这就是我在答案中说的,不是吗?
Kerrek SB 2011年

8
@mike:成员模板是完全正常且常见的事情。
Kerrek SB 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.