Dato il seguente codice:Moving Template Method a Breaks derivati Compilation
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);
}
Questo compila e funziona bene; le versioni corrette in sovraccarico di B::foo()
vengono scelte e chiamate per a
e a.t
.
Ora mi introdurre una nuova classe che deriva da C
B
e spostare la versione del modello di ::foo()
fuori B
e in 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
}
E ora il codice non viene compilato più. Visual Studio 2005 è affermando:
error C2784: 'void C::foo(A<T> &)' : could not deduce template argument for 'A<T> &' from 'int'
Infatti, chiamando C::foo()
con qualsiasi int
risultati di valore in questo errore. Sembra quasi che il sovraccarico del metodo per int
venga nascosto dall'overload del modello.
Perché sta succedendo? È un problema con il compilatore di Visual Studio 2005? Sfortunatamente, non posso testarlo su nessun altro compilatore in questo momento.
Qualsiasi informazione è apprezzata.