在模板类中调用模板函数

Thi*_*ilo 27 c++ templates

免责声明:以下问题可能非常简单,我可能会对第一个答案感到震惊.此外,我想为任何重复的问题道歉 - 句法问题并不总是容易识别是口头解释,因此搜索它们并不容易......

但足够了.我有两个模板化的类,其中一个有模板化的成员函数,另一个类试图调用该函数.最小的错误生成示例如下所示:

#include <iostream>

template <typename T>
class Foo {
public:
    Foo() {
    }

    template <typename outtype>
    inline outtype bar(int i, int j, int k = 1) {
        return k;
    }

};

template <typename T>
class Wrapper {
public:
    Wrapper() {
    }

    double returnValue() {
        Foo<T> obj;
        return obj.bar<double>(1,2); // This line is faulty.
    }

};

int main() {
    Wrapper<char> wr;
    double test = wr.returnValue();
    std::cout << test << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在编译时,这会导致

expected primary-expression before 'double'
expected ';' before 'double'
expected unqualified-id before '>' token
Run Code Online (Sandbox Code Playgroud)

其中所有错误消息都指向代码中标记的linke.

我已经感谢你的想法了,不管它们有多么明显.

Naw*_*waz 48

obj.bar<double>(1,2); // This line is faulty.
Run Code Online (Sandbox Code Playgroud)

template关键字这里需要,因为obj是一类型的实例Foo<T>,其依赖于模板参数T,并且因此上述应写为:

obj.template bar<double>(1,2); //This line is corrected :-)
Run Code Online (Sandbox Code Playgroud)

请阅读@ Johannes的答案,详细说明如下:


Thi*_*ilo 5

经常这样:问题发布后,答案就全靠它了。将故障线路更正为

return obj.template bar<double>(1,2);
Run Code Online (Sandbox Code Playgroud)

产生预期的结果。

谢谢阅读...