Tor*_* L. 5 c++ inheritance overloading
给出以下代码:
template<typename T>
class A
{
public:
T t;
};
class B
{
public:
void foo(int i) {}
template<typename T>
void foo(A<T>& a) {}
};
int main()
{
A<int> a;
B b;
b.foo(a );
b.foo(a.t);
}
Run Code Online (Sandbox Code Playgroud)
这编译并且工作正常; 正确重载版本B::foo()
进行选择,并呼吁a
和a.t
.
现在我介绍一个新的类C
,从派生B
和移动的模板版本::foo()
出来B
,进入C
:
template<typename T>
class A
{
public:
T t;
};
class B
{
public:
void foo(int i) {}
};
class C: public B
{
public:
template<typename T>
void foo(A<T>& a) {}
};
int main()
{
A<int> a;
C c;
c.foo(a ); // Fine
c.foo(a.t); // Error
}
Run Code Online (Sandbox Code Playgroud)
现在代码将不再编译.Visual Studio 2005说明:
error C2784: 'void C::foo(A<T> &)' : could not deduce template argument for 'A<T> &' from 'int'
Run Code Online (Sandbox Code Playgroud)
实际上,C::foo()
使用任何int
值调用都会导致此错误.几乎看起来方法重载int
被模板重载隐藏了.
为什么会这样?这是Visual Studio 2005编译器的一些问题吗?不幸的是,我现在无法在任何其他编译器上测试它.
任何信息表示赞赏.
几乎看起来int的方法重载被模板重载隐藏了.
究竟!您需要在C类中添加using声明:
class C: public B
{
public:
using B::foo;
template<typename T>
void foo(A<T>& a) {}
};
Run Code Online (Sandbox Code Playgroud)
在派生类中声明成员函数时,将隐藏基类中具有相同名称的所有成员函数.参见ISO/IEC 14882:2011的§3.3.10/ 3:
派生类(第10条)中成员的声明隐藏了同名基类成员的声明; 见10.2.