2009-06-17 6 views
6

Lors de la recherche d'une réponse à une question (sur la base this answer) J'ai essayé de faire ce qui suit:Pourquoi ne puis-je pas me lier d'amitié avec un paramètre de modèle?

template <class T> 
class friendly { 
    friend class T; 
}; 

friendly<string> howdy; 

Cela ne peut pas compiler avec l'erreur suivante:

error: template parameter "T" may not be used in an elaborated type specifier friend class T;

D'après ce que je peux comprendre de mon bon ami Google c'est pour que je n'essaye pas accidentellement d'instancier friendly<int> mais pourquoi cela devrait-il être une erreur lors de la compilation du template? Ce ne devrait pas être une erreur lors de l'instanciation du modèle avec un type invalide (comme si j'avais écrit int f() { return T::foo(); })

+5

Comment faire des amis et influencer les paramètres. – TheTXI

+1

Voici une question connexe: http://stackoverflow.com/questions/392120/why-cant-i-declare-a-friend-through-a-typedef –

Répondre

2

Un peu plus googleling fait monter friend Extension des déclarations(PDF) pour C++0x.

Ce document contient les éléments suivants:

template <typename T> class R { 
    friend T; 
}; 
R<C> rc; // class C is a friend of R<C> 
R<int> ri; // OK: “friend int;” is ignored 

qui va encore plus loin que ce que je pensais (en ignorant friend illégales décélérations plutôt que de ne pas lors de l'instanciation). Je suppose donc que la réponse est qu'il n'y a pas de bonne raison et qu'elle est rectifiée.

3

Le paragraphe 7.1.5.3 de la norme décrit explicitement ceci comme un exemple d'un spécificateur de type élaboré malformé. Une discussion à ce sujet peut être trouvée here.

+0

+1, bonne trouvaille. Je me souviens d'avoir buté contre cette fois. Je ne sais pas pourquoi c'est verboten cependant - peut-être cela a-t-il causé des difficultés pour les implémenteurs de compilateurs? –

+1

Ne remets pas en question la bible, fils. –

+0

J'ai jeté un coup d'oeil sur le fil référencé et mis à part le fait qu'il est illégal de ne pas comprendre pourquoi (ce que je suis après dans cette question). – Motti