2016-01-17 1 views
-1

Je voudrais réaliser quelque chose comme ça:définissant les méthodes de classe modèle

template <class that, class has, class much, class genericizem> 
class Generic{ 
// using all template stuff 
    Generic &method(Generic &gen1, Generic &gen2); 
}; 

// what I assume is the solution from vage things I've read 

template <class that, class has, class much, class genericizem> 
    using Gen = Generic<that,has,much,genericizem>; 

// and no one wants to see the naive way of writing it. 
Gen &Gen::method(Gen &gen1, Gen &gen2){ 
    return gen1; 
} 

Je sais que vous ne pouvez pas un espace de noms modèle que, alors que je vous écris juste le long chemin?

+0

Veuillez installer et utiliser un correcteur d'orthographe. ;) Cela dit, les modèles et la fonction surchargée facilitent la façon dont vous utilisez les choses, mais je ne comprends pas comment vous avez l'intention d'utiliser votre code. Quelle est la syntaxe d'appel que vous voulez atteindre? Tout ce dont vous avez besoin n'est-il pas ici un alias de type? –

Répondre

0

Ce que vous voulez, si je comprends bien votre question, ne peut pas être fait comme vous essayez. Même si votre using Gen = ... a travaillé, vous auriez encore besoin d'écrire:

template <class that, class has, class much, class genericizem> 
Gen<that,has,much,genericizem> &Gen<that,has,much,genericizem>::method(Gen &gen1, Gen &gen2){ 

becuase Gen est un alias de modèle, atually tout à fait équivalent à la Genric originale.

Votre fonction membre peut être définie comme:

template <class that, class has, class much, class genericizem> 
auto Generic<that,has,much,genericizem>::method(Generic &gen1, Generic &gen2) -> Generic& 
{ 
    /* ... */ 
} 

Vous n'avez pas besoin de répéter tous les arguments de modèle à chaque fois que vous faites référence à Generic, car une plaine Generic signifie la classe à instancier. C'est ce qu'on appelle le nom de la classe injectée.

Mais notez que syntaxiquement le type de retour ne se trouve pas dans la portée de classe, donc vous ne pouvez pas utiliser le nom de la classe injectée ici. Au lieu de cela, vous pouvez utiliser auto et un type de retour arrière.

+0

Je suppose que vous ne pouvez pas avoir du code sans écrire (ou copier coller). Auto est bon, et j'ai aussi pensé que je devais écrire des arguments pour les arguments afin que ce soit un bug corrigé. Merci!. – rustypaper

+0

@rustypaper: Parfois être explicite vaut un peu de copier/coller. Si elles sont vraiment lourdes, vous pouvez utiliser des macros, mais je considérerais cela comme un dernier recours. – rodrigo

+0

dans le cas où vous vous demandez, j'ai passé 2 heures pour trouver un travail autour de 20 min de travail. – rustypaper