我不明白,在我看来,对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>();
}
};
发布于 2011-02-09 16:34:54
这是由于标准中的一个非常模糊的条款,在该条款中,如果您有一个模板,试图访问其类型依赖于模板参数的对象中的模板函数,则必须以一种奇怪的方式使用template
关键字:
this->template f<int>();
这类似于typename
的奇怪之处,除了应用于函数之外,它还会产生依赖类型。特别是,如果省略了template
关键字,
this->f<int>()
(您想要的),以及
((this->f) < int) > ()
这是没有意义的(这就是你的错误)。这里关键字template
的使用消除了歧义,并迫使编译器认识到,它看到的是对模板化成员函数的完全有效调用,而不是一大堆乱码。
希望这能有所帮助!
https://stackoverflow.com/questions/4942703
复制相似问题