J'ai écrit le code suivant:Comment définir et utiliser une fonction friend dans une classe temlate avec le même template?
#include <iostream>
using namespace std;
template <class T>
class AA
{
T a;
public:
AA()
{
a = 7;
}
friend void print(const AA<T> & z);
};
template <class T>
void print(const AA<T> & z)
{
cout<<"Print: "<<z.a<<endl;
}
void main()
{
AA<int> a;
print<int>(a);
}
Et obtenir l'erreur suivante:
error C2248: 'AA<T>::a' : cannot access private member declared in class 'AA<T>'
1> with
1> [
1> T=int
1> ]
1> c:\users\narek\documents\visual studio 2008\projects\aaa\aaa\a.cpp(7) : see declaration of 'AA<T>::a'
1> with
1> [
1> T=int
1> ]
1> c:\users\narek\documents\visual studio 2008\projects\aaa\aaa\a.cpp(30) : see reference to function template instantiation 'void print<int>(const AA<T> &)' being compiled
1> with
1> [
1> T=int
1> ]
Qu'est-ce qui ne va pas?
P.S. J'utilise Visual Studio 2008.
Il fonctionne. Si étrange...! Si la fonction est une fonction amie, cela signifie que ce n'est pas une fonction de classe. Comment le compilateur peut-il «penser» que la fonction est la fonction d'une classe? Ou vous dites quelque chose de différent en disant "en classe"? – Narek
Il s'est avéré que mon explication n'était pas tout à fait correcte. Edited it et il devrait être plus clair maintenant :) – Job
Pourquoi devrais-je déclarer imprimer avant AA? J'ai précédemment créé des fonctions frind dans ma classe et implémenté ces fonctions dans un fichier .cc (après la classe) et cela fonctionne. Pourquoi maintenant la fonction frite devrait être avant AA? Je veux dire comment cela aide le compilateur? – Narek