:これは、コンパイルし、正常に動作しますコンパイル次のコードを考える
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
が呼び出されます。
今私はB
から派生し、B
から出てC
に::foo()
のテンプレートバージョンを移動し、新しいクラス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'
、このエラーのいずれかのint
値の結果とC::foo()
を呼び出します。 int
のメソッドオーバーロードがテンプレートのオーバーロードによって隠されているようです。
どうしてですか? Visual Studio 2005のコンパイラに問題はありますか?残念ながら、私は他のどのコンパイラでもこれをテストすることはできません。
何か情報がありがとうございます。