Perché questo non riesce a compilare con GCC 4.4?Sovraccarico di modelli di funzioni nei namespace
template<typename T>
class A {
public:
void foo() {
}
private:
T x;
};
namespace Ns {
template<typename T>
void do_it (A<T> a) {
a.foo();
}
};
template<typename T>
void myfun (T x) {
Ns::do_it (x);
}
template<typename T>
class B {
public:
void bar() {
}
private:
T x;
};
namespace Ns {
template<typename T>
void do_it (B<T> b) {
b.bar();
}
};
int main() {
A<int> a;
B<int> b;
myfun (a);
myfun (b); // error: no matching function call to do_it(B<int>&)
return 0;
}
Deve avere qualcosa a che fare con lo spazio dei nomi di do_it
. Quando rimuovo lo spazio dei nomi attorno ad esso, viene compilato.
Contesto: Sto creando un set di funzioni che possono essere utilizzate con molte classi di contenitori differenti. Per gestire le diverse interfacce in modo uniforme, utilizzo le funzioni freestanding che sono sovraccariche per ciascuna delle classi contenitore. Queste funzioni devono essere inserite in uno spazio dei nomi per evitare di ingombrare lo spazio dei nomi globale con loro.
Le definizioni per B devono essere pensate come provenienti da un file di intestazione diverso da quelli di A, quindi il riordino non è un'opzione.
È un errore di battitura! Lo è stato inghiottito dall'HTML. –
VS 2010 compila il codice sopra, e credo che sia corretto nel farlo, ma questo è un esempio difficile. Bella domanda! –
Lo stesso con VS2008, l'ho appena controllato. Potrebbe essere un bug in GCC o la loro interpretazione è diversa da quella di Microsoft? Il fatto che funzioni senza uno spazio dei nomi potrebbe essere un bug, vero? –