我试图理解为什么以下代码无法编译(使用gcc 4.8.2):
struct A {
template <typename T>
T f() {return T(0);}
};
struct B : A {
using MyT = int;
MyT f() {return (A *)this->template f<MyT>();}
};
int main()
{
B b;
std::cout << b.f() << std::endl;
return 0;
}
如果我将名称从基础中的f
更改为f1
,那么以下编译就可以了:
struct A {
template <typename T>
T f1() {return T(0);}
};
struct B : A {
using MyT = int;
MyT f() {return this->template f1<MyT>();}
};
答案 0 :(得分:3)
仅仅因为运算符优先,您将f
函数的结果投射到A*
,而不是将this
投射到A*
,实际上更好地使用static_cast
}。
MyT f() {return static_cast<A*>(this)->f<MyT>();}
这会奏效。你也隐藏了名字,你只需这样做:
struct B : A {
using MyT = int;
using A::f;
MyT f() {return this->f<MyT>();}
};