2008-12-06 13 views
5

Est-il possible d'utiliser la déclaration "using" avec des classes de base de template? J'ai lu que ce n'est pas here mais est-ce à cause d'une raison technique ou est-ce contraire à la norme C++, et cela s'applique-t-il à gcc ou à d'autres compilateurs? Si ce n'est pas possible, pourquoi pas?La déclaration "using" peut-elle être utilisée avec des templates?

code Exemple (à partir du lien ci-dessus):

struct A { 
    template<class T> void f(T); 
}; 

struct B : A { 
    using A::f<int>; 
}; 
+0

Pouvez-vous ajouter un peu plus d'informations à votre question? À votre avis, qu'est-ce qui est illégal? Le lien ne mentionne rien sur les templates – JaredPar

+0

Jared, j'ai corrigé le lien. –

+0

Oui, désolé, j'ai copié le lien de la barre d'adresse et c'était le mauvais. – Sydius

Répondre

4

Ce que vous est lié à une directive à l'aide. Une déclaration à l'aide peut être utilisé très bien avec les classes de base templated (ne l'ont pas regardé vers le haut dans la norme, mais juste testé avec un compilateur):

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); 
} 

Le compilateur trouve correctement le paramètre moins fonction foo en raison de notre déclaration d'utilisation la re-déclarant dans la portée de c2, et sort le résultat attendu.

Modifier: mise à jour de la question. Voici la réponse mise à jour:

L'article a raison de dire que vous n'êtes pas autorisé à utiliser un ID de modèle (nom de modèle et arguments). Mais vous pouvez mettre un nom de modèle:

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); 
} 
+0

Ceci est quelque chose d'autre. L'OP signifiait probablement un modèle de fonction membre résidant dans la classe de base. –

+0

Désolé, je suis nouveau à l'utilisation. Est-il possible d'appeler foo depuis une méthode c2 sans avoir à spécifier la classe de base, à savoir "foo()" au lieu de "c1 :: foo()"? – Sydius

+0

Sydius, oui tu fais ça-> foo(); le foo est dans le baseclass, et celui-ci dépend d'un paramètre de modèle. la norme dit que l'appel doit être qualifié soit avec l'opérateur de portée (c1 :: foo()) soit en utilisant ce-> foo() ;. sinon, il suppose que "foo" est une fonction globale –