次のコードがあるとします。
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 のコンパイラの問題ですか? 残念ながら、今のところ他のコンパイラでテストすることはできません。
どんな情報でも大歓迎です。