【问题标题】:Calling template function within template class在模板类中调用模板函数
【发布时间】:2011-09-13 06:56:19
【问题描述】:

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

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

#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

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

我已经感谢您的想法,无论它们多么明显。

【问题讨论】:

  • 由于无法推断其设置,因此需要显式限定。如果没有模板,我们会得到一个语法错误,这将被视为

标签: c++ templates


【解决方案1】:
obj.bar<double>(1,2); // This line is faulty.

这里需要template关键字,因为objFoo&lt;T&gt;类型的一个实例,它依赖模板参数T,所以上面应该写成:

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

在此处阅读@Johannes 的答案以获得详细说明:

【讨论】:

    【解决方案2】:

    通常情况下:一旦发布问题,答案就会自行出现。 将故障线路改正为

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

    产生预期的结果。

    感谢阅读...

    【讨论】:

      【解决方案3】:

      这可能是foo.template bar‹ double &gt; 的情况吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-06
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多