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

我不明白,在我看来,对 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>();
}
};
2980 次浏览

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

this->template f<int>();

这与 typename提出的依赖类型的怪异之处类似,只是应用于函数时除外。特别是,如果省略了 template关键字,则

this->f<int>()

(你的意图) ,以及

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

这是没有意义的(因此你的错误)。这里使用关键字 template消除了歧义,并迫使编译器认识到它正在查看对模板化成员函数的完全有效的调用,而不是乱七八糟的大量符号。

希望这个能帮上忙!