当它被称为同名时,调用基础的模板函数成员

时间:2016-01-21 12:34:58

标签: c++

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

1 个答案:

答案 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>();}
};