2010-07-21 7 views
2

s'il vous plaît considérez le code suivant:ami Modèle et classes imbriquées

template <typename T> 
struct foo 
{ 
    template <typename S> 
    struct bar 
    { 
     template <typename> friend struct bar; 
    }; 
}; 

J'aimerais tous les instanciations de foo<T>::bar être amis de foo<T>::bar<S> pour tout S. Si bar n'est pas un modèle imbriqué, la syntaxe ci-dessus fonctionne très bien. Mais quand je fais par exemple

int main() 
{ 
    foo<int> x; 
} 

MSVC8 (Visual C++ 2005) ne l'aime pas:

1>.\main.cpp(11) : error C3855: 'foo<T>::bar': template parameter 'S' is incompatible with the declaration 
1>  .\main.cpp(12) : see reference to class template instantiation 'foo<T>::bar<S>' being compiled 
1>  .\main.cpp(14) : see reference to class template instantiation 'foo<T>' being compiled 

Le compilateur me donne les mêmes erreurs si j'utilise

template <typename> friend struct foo<T>::bar; 

place . Comment puis-je réaliser ce que je veux?

EDIT: Je revérifié (c'est le matin, et je ne suis pas vraiment éveillé), cela semble être un VC8 bug:

+4

Semble fonctionner sur ma machine. Même compilateur cependant. – DumbCoder

+0

J'ai copié le code exact ci-dessus, non inclus, et j'ai copié collé les messages d'erreur. –

Répondre

2

Toutes les restrictions pour ami d'un modèle de classe ou de classe sont décrits dans la section 14.5.3 de le standard C++. Votre code est valide Vérifiez que vous avez installé tous les derniers Service Packs pour Visual Studio. Here vous pouvez trouver des bugs connexes dans Visual Studio.

+0

Merci, il semble en effet être un bug VC8. Malheureusement, je ne peux pas changer le compilateur, alors je vais aller avec les membres du public. –

+0

[This] (https://connect.microsoft.com/VisualStudio/feedback/details/262353/compile-error-when-making-a-template-class-a-friend-of-itself-works-on-vc7 -1-and-gcc-3-4-4 # details) bug est très probablement le même problème. Envisagez d'installer le Service Pack pour VC8. –

Questions connexes