Quelqu'un peut-il dire ce qui ne va pas avec cette pièce de code?
$ g++ source.cpp source.cpp:8: error: prototype for âvoid C<X>::f(Y)â does not match any in class âC<X>â source.cpp:4: error: candidate is: template<class X> template<class Y> void C::f(Y)
3 Réponses :
Le compilateur vous dit déjà la réponse. La classe C code> est un modèle avec un paramètre et la fonction de membre f code> est une fonction de modèle membre, et vous devez le définir de la même manière: template <class X>
template <class Y>
void C<X>::f(Y y)
{
// Something.
}
Belle réponse, merci! Une chose de plus: pourquoi @ "Johannes Schaub - LitB" a déclaré à la réponse acceptée de la question liée à la note que cette pratique (au moins, je pense qu'il faisait référence à "Modèle <> Modèle <>") n'est pas correct?
@FreITass: Je ne suis pas sûr de ce que vous parlez (pouvez-vous être plus précis?), Mais la question liée est sur la spécialisation du modèle i>, que vous ne faites pas dans votre situation.
Eh bien, Ce est la réponse et je suis Demander la première ligne de la réponse et la première partie du code.
@FreITASS: Encore une fois, cette réponse est sur Spécialisée i> le paramètre de modèle (OP souhaitait spécialiser le modèle de membre mais pas la classe elle-même). Comment cela s'applique-t-il à vous?
Je pensais juste que les deux sont liées avec des classes de modèles avec des fonctions de modèle. Merci pour le en ligne code> une partie de votre réponse aussi (et encore = D). Je n'avais pas eu d'indice à ce sujet.
L'erreur vous indique exactement, votre code devrait ressembler à ceci:
template<class X>
class C {
public:
template<class Y> void f(Y); // line 4
};
template<class X> template<class Y>
void C<X>::f(Y y) { // line 8
// Something.
}
int main() {
C<int> c;
char a = 'a';
c.f(a);
return 0;
}
En bar de côté, il est préférable d'utiliser le mot-clé «typename» au lieu de «classe» dans une liste d'arguments de modèle. P>
Oui, j'ai lu ça aussi. Mais il y a tellement de gens utilisant la classe .. Je ne veux pas nager contre la marée (du moins pas pour cette raison: p)
Cela devrait probablement être un commentaire, pas une réponse. En outre, je ne suis pas d'accord ou en désaccord avec vous, mais vous devriez probablement récupérer votre déclaration avec quelques faits quant à la raison pour laquelle l'utilisation de «typename» est préférable à la «classe».
@andand: Je suis tout à fait d'accord.
Stackoverflow.com/ Questions / 213121 / ...
est une classe? Non. Sera-t-il accepté comme un argument de modèle? Oui. Est-ce ambiguë? Oui. Pouvez-vous l'empêcher? Oui. Utilisez 'typosame'.
Beaucoup de gens préfèrent classe code>. typename code> peut légitimement apparaître avec son autre sens dans une liste de paramètres de modèle. Au moins classe code> est sans ambiguïté. Dans un modèle classe code> signifie simplement "type". La norme utilise presque universellement class code>, pas typename code>.