我试图了解为什么以下代码无法编译(使用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>();}
};
最佳答案
仅仅因为运算符优先,您将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>();}
};
关于c++ - 调用相同名称的基础的模板函数成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34923991/