& # 8220; può utilizzare & # 8221; dichiarazione da utilizzare con i modelli?
Domanda
È possibile utilizzare " usando " dichiarazione con classi base modello? Ho letto che non è qui ma è per un motivo tecnico o è contrario allo standard C ++ e si applica a gcc o altri compilatori? Se non è possibile, perché no?
Codice di esempio (dal link sopra):
struct A {
template<class T> void f(T);
};
struct B : A {
using A::f<int>;
};
Soluzione
Ciò a cui sei collegato è una direttiva using. Una dichiarazione using può essere usata bene con le classi base basate su modelli (non l'hanno cercata nello standard, ma l'ha appena testata con un compilatore):
template<typename T> struct c1 {
void foo() { std::cout << "empty" << std::endl; }
};
template<typename T> struct c2 : c1<T> {
using c1<T>::foo;
void foo(int) { std::cout << "int" << std::endl; }
};
int main() {
c2<void> c;
c.foo();
c.foo(10);
}
Il compilatore trova correttamente la funzione foo
senza parametri a causa della nostra dichiarazione di utilizzo che lo ha nuovamente dichiarato nell'ambito di c2
e genera il risultato atteso.
Modifica : aggiornata la domanda. ecco la risposta aggiornata:
L'articolo ha ragione sul fatto che non ti è permesso usare un template-id (nome del template e argomenti). Ma puoi inserire un nome modello:
struct c1 {
template<int> void foo() { std::cout << "empty" << std::endl; }
};
struct c2 : c1 {
using c1::foo; // using c1::foo<10> is not valid
void foo(int) { std::cout << "int" << std::endl; }
};
int main() {
c2 c;
c.foo<10>();
c.foo(10);
}