首页 > 解决方案 > 在模板类中调用静态模板方法的问题

问题描述

我里面有一个模板类和一个静态模板方法。我还有一个简单的函数 g,它只允许用户以适当的方式调用这个方法。这段代码在 g 函数中给了我一个错误“在 '>' 标记之前的预期主表达式”。但是如果我像这样在 g 函数中调用一个方法:

return A<types::a>::f<T>();

在这种情况下,代码编译得很好并且没有错误。我怎样才能解决这个问题,问题是什么?

enum class types : uint8_t
{
    a, b
};

template<types type>
struct A {
    template<typename T>
    static T f();
};

template<>
template<typename T>
T A<types::a>::f() {
    cout << "a" << endl;
    return T{};
}

template<>
template<typename T>
T A<types::b>::f() {
    cout << "b" << endl;
    return T{};
}

template<types type, typename T>
T g() {
    return A<type>::f<T>();
}

int main() {
    g<types::a, int>();
}

标签: c++

解决方案


您需要添加一个template关键字:

template<types type, typename T>
T g() {
    return A<type>::template f<T>();
}

演示

A<type>::f是一个依赖名称(取决于模板参数type)。为了在遇到模板定义时正确解析该语句(根据两阶段查找规则的要求),编译器必须在实例化之前知道f是变量、类型还是模板。它默认为“它是一个变量”;addtemplate表示模板或typename表示类型。

您的其他情况有效,因为return A<types::a>::f<T>();没有从属名称。


推荐阅读