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>;
};
È stato utile?

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); 
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top