在模板类中调用静态模板方法的问题

时间:2019-01-18 12:50:04

标签: c++

我内部有一个模板类和一个静态模板方法。我还有一个简单的函数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>();
}

1 个答案:

答案 0 :(得分:1)

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

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

Demo

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

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

相关问题