给定以下代码:
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);
}
这可以编译并正常工作;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
}
现在代码将不再编译。Visual Studio 2005 声明:
error C2784: 'void C::foo(A<T> &)' : could not deduce template argument for 'A<T> &' from 'int'
事实上,C::foo()
使用任何int
值调用都会导致此错误。似乎方法重载int
被模板重载隐藏了。
为什么会这样?Visual Studio 2005 的编译器有问题吗?不幸的是,我现在无法在任何其他编译器上测试它。
任何信息表示赞赏。