我不明白,在我看来,对 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) > ()
这没有任何意义(因此你的错误)。此处使用关键字 template
可以消除歧义并强制编译器识别它正在查看对模板化成员函数的完全有效调用,而不是一堆乱码。
希望这会有所帮助!
关于c++ - 为什么尝试使用显式类型参数调用模板成员函数时会出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4942703/