Clang VS VC++:“erreur: déclaration de 'T' ombres paramètre de modèle”

J'ai essayé de compiler le code suivant pour la copie classique&échanger de l'idiome sur mon Mac avec clang 3.3

template<typename T> class node{

private:
    node<T>* left;
    node<T>* right;
    T value;

public:
    friend void swap(node<T>&, node<T>&);
    //other stuff
}

Encore l'éditeur de liens se plaint. Maintenant, je comprends que je dois déclarer la fonction en tant que modèle. Mais l'erreur serait de se produire si je suis le style, comme l'a suggéré ici à partir de MSDN:

template <class T> class Array {
    T* array;
    int size;

public:template<class T>
    //...
    template <class T>
    friend Array<T>* combine(Array<T>& a1, Array<T>& a2);
};

J'ai fait copier-coller, mais il a obtenu l'erreur suivante:

te.cpp:33:19: error: declaration of 'T' shadows template parameter
template<class T>
               ^
te.cpp:4:17: note: template parameter is declared here
template <class T> class Array {
                ^
1 error generated.

Est-ce un clang bug? Le site web MSDN l'indique, il fonctionne sous VC++.

PS: je sais qu'il y a deux solutions: définir l'ami de la fonction à l'intérieur de la classe de modèle comme dans le Stackoverflow article, ou de déclarer de la manière suivante à l'intérieur de la classe de modèle:

template <typename U> friend void swap(node<U>&, node<U>&);

Mais les deux me dérange pas. Les premières grappes de la déclaration de la classe tandis que le second subventions de l'amitié pour échanger différents types.

Mise à jour: Une troisième solution est d'utiliser la déclaration de l'avant avec la spécialisation:

template <typename T> class node;
template <typename T> void swap (node<T>&, node<T>&);
template <typename T> class node{
    //...
    friend void swap<> (node<T>&, node<T>&);
};

Cela fonctionne sous clang trop.

Où est votre définition pour le swap? C'est probablement le problème.
Oh, j'ai mis en œuvre du modèle. Dans le cas où vous avez besoin de le voir template <typename T> void swap(node<T>& a, node<T>& b){ std::swap(a.left, b.left); std::swap(a.right, b.right); std::swap(a.value, b.value); }
Votre premier extrait regarde, à droite, à moi... "Pourtant, l'éditeur de liens se plaint." fix qui, au lieu de casser votre code d'aller plus loin ;P

OriginalL'auteur CloudyTrees | 2014-01-02