Il est explicitement spécifié par la norme linguistique en 14.6.1/1:
Within the scope of class template, when the name of the template is neither qualified nor followed by <, it is equivalent to the name of the template followed by the template-parameters enclosed in <>.
Cela a été reformulée (à travers le concept de « nom de la classe injectée ») dans les versions ultérieures de la norme, mais le fait est que ce comportement est explicitement épelé dans le document.
Pour répondre à la deuxième partie de votre question, cette règle s'applique également aux déclarations de paramètres lors de l'écriture de définitions de méthodes hors classe, mais elle ne s'applique pas aux déclarations de type de retour. Par exemple, ce code est OK
template <typename T> struct S {
S foo(S);
};
template <typename T> S<T> S<T>::foo(S s) {
/* whatever */
}
mais vous ne pouvez pas retirer le du type de retour bit <T>
dans la définition de la méthode. (Et vous ne pouvez pas supprimer <T>
du nom qualifié de la méthode.)
Quant au constructior spécifiquement: votre devrait utiliser le nom complet (avec <T>
) pour la classe, mais vous ne devriez pas utiliser <T>
au nom du constructeur lui-même. Ainsi, la forme la plus courte pour la définition hors classe dans votre cas serait
template <typename T> Wrapper<T>::Wrapper(const Wrapper& w) : t_(w.t_)
{
}
Notez que vous ne pouvez pas ajouter le bit <T>
au nom du constructeur, même si vous voulez
template <typename T> Wrapper<T>::Wrapper<T>(const Wrapper& w)
^ERROR !!!
PS Cette dernière demande a besoin de plus de recherches. Le compilateur Comeau Online pense que c'est une erreur, alors que GCC pense que c'est OK. Je reviendrai plus tard.
P.P.S. Le compilateur MSVC++ 2005 se plaint de cette dernière déclaration avec un avertissement
warning C4812: obsolete declaration style: please use 'Wrapper<T>::Wrapper' instead
Intéressant ...
J'ai essayé avec GCC 4.4.2, et il rejette avec « main1.cpp: 4: erreur: utilisation incorrecte du constructeur en tant que modèle ". J'ai envoyé une réponse à votre question Usenet, je pense qu'il devrait apparaître bientôt, avec quelques réflexions sur ce genre de choses. –