为什么我尝试使用显式types参数调用模板成员函数时出错?

我不明白,在我看来,对f的调用是完全明确的,但是expected primary-expression before 'int'没有用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>(); } }; 

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

 this->template f<int>(); 

除了应用于函数之外,这类似于与依赖types相关的typename的古怪types。 特别是,如果您遗漏了template关键字,则存在parsing模糊性

 this->f<int>() 

(你的意图),和

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

这没有任何意义(因此你的错误)。 在这里使用关键字template消除歧义,并强制编译器认识到它正在寻找对模板化成员函数的完全有效的调用,而不是乱码。

希望这可以帮助!