使用多态模板重载函数

时间:2010-09-10 16:41:18

标签: c++ templates

为什么下面的代码没有编译?如何使用基类中的函数?

template<typename K> struct Base
{
    K foo() { return (K)0; }
};

template<typename K> struct Extension
: public Base<K>
{
    K foo(int a) { return (K)a; }
};

int main()
{
    Extension<float> e;
    e.foo();
    return 0;
}

编辑:好吧,我认为这只发生在模板类中......设计决策背后隐藏基类版本的原因是什么?我的意思是,在同一个类中声明这两个函数都可以正常工作。

4 个答案:

答案 0 :(得分:3)

Extension::foo正在隐藏Base::foo。您可以使用using声明将其恢复:

template<typename K> struct Extension
: public Base<K>
{
    using Base<K>::foo;
    K foo(int a) { return (K)a; }
};

Scott Meyers的“有效C ++”项目#33(“避免隐藏继承的名称”)就此问题而言。

答案 1 :(得分:3)

添加使用声明,如其他答案显示或使用限定名称

进行呼叫
e.Base<float>::foo();

答案 2 :(得分:1)

来自Extension的foo隐藏了来自Base的foo。

在Extension中添加using子句可以解决编译错误。

template<typename K> struct Base
{
    K foo(void) { return (K)0; }
};

template<typename K> struct Extension
: public Base<K>
{
    using Base<K>::foo;
    K foo(int a) { return (K)a; }
};

int main()
{
    Extension<float> e;
    e.foo();
    e.foo(1);
    return 0;
}

答案 3 :(得分:0)

看起来像Base :: foo()是私有的。