为什么我在调用带有显式类型参数的模板成员函数时出错?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (12)

我不明白,在我看来f是完全明确的,但是它无法用expected primary-expression before ‘int’。如果我用调用f它编译得很好。

template<typename T>
struct A {
    template<typename S>
    void f() { }
};

template<typename T>
struct B : A<T> {
    void g() {
        this->f<int>();
    }
};
提问于
用户回答回答于

这是由于标准中的一个非常模糊的规定,在该标准中,如果有一个模板试图访问类型依赖于模板参数的对象中的模板函数,则必须使用template关键字以一种奇怪的方式:

this->template f<int>();

这类似于typename这就产生了依赖类型,除非应用于函数。特别是,如果你忽略了template关键字之间存在一个解析歧义

this->f<int>()

(如你所愿),以及

((this->f) < int) > ()

希望这能帮上忙!

扫码关注云+社区