2010-09-10 75 views
2

为什么下面的代码不能编译以及如何使用基类中的函数?使用多态模板重载函数

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; 
} 

编辑:好吧,我认为这是只与模板类发生...什么是背后的设计决定从子类的重载版本隐藏了基类版本的想法?我的意思是,在同一个类中声明这两个函数都可以。

回答

3

Extension::foo正在隐藏Base::foo。您可以使用使用delaration把它带回来:

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

项目#33(“避免隐藏继承的名称”)的斯科特迈尔斯的“有效的C++”,是这个问题。

0

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

+0

这些结构拨打电话。 struct的默认访问是公共的。 – Danvil 2010-09-10 16:43:34

+0

啊是的。 -1为我自己。什么是编译器错误? – 2010-09-10 16:46:29

1

Extension的foo隐藏了基地的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

要么添加使用声明像其他的答案显示或使用合格的名称

e.Base<float>::foo();