为什么下面的代码没有编译?如何使用基类中的函数?
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;
}
编辑:好吧,我认为这只发生在模板类中......设计决策背后隐藏基类版本的原因是什么?我的意思是,在同一个类中声明这两个函数都可以正常工作。
答案 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()是私有的。