我试图了解为什么以下代码无法编译(使用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/

10-12 05:52