在模板类中调用模板函数

Calling template function within template class

本文关键字:函数 调用      更新时间:2023-10-16

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

但是够了。我有两个模板化的类,其中一个有一个模板化的成员函数,另一个类尝试调用那个函数。下面显示了一个最小的、产生错误的示例:

#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;
}

在编译时,结果是

expected primary-expression before 'double'
expected ';' before 'double'
expected unqualified-id before '>' token

,所有的错误信息都指向代码中标记的链接。

我已经感谢你的想法,不管它们是多么明显。

obj.bar<double>(1,2); // This line is faulty.

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

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

阅读@Johannes的回答,这里有详细的解释:

  • 在哪里以及为什么我必须把"模板"answers";typename"关键字?

一如既往:问题一经发布,答案就自动出现了。将故障线修正为

return obj.template bar<double>(1,2);

产生预期的结果。

这是foo.template bar‹ double >的情况吗?