classe template amie

classe template amie - C++ - Programmation

Marsh Posté le 19-12-2003 à 17:05:40    

Bonjour,
j'ai une classe template qui doit accéder aux membres privés d'une autre classe.
 
j'ai essayé ceci :
 

Code :
  1. template<typename T>
  2. class gcRef
  3. {
  4.   // ...
  5. };
  6. class GC
  7. {
  8.   friend gcRef<typename>;
  9.   // ...
  10. };


 
mais ca ne fonctionne pas, qq1 pourrait m'eclairer ?


Message édité par blackgoddess le 19-12-2003 à 17:06:01

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 19-12-2003 à 17:05:40   

Reply

Marsh Posté le 19-12-2003 à 17:17:27    

BlackGoddess a écrit :

Code :
  1. template<typename T>
  2. class gcRef
  3. {
  4.   // ...
  5. };
  6. template<typename T>
  7. class GC
  8. {
  9.   friend class gcRef<T>;
  10.   // ...
  11. };


 

Reply

Marsh Posté le 19-12-2003 à 17:33:25    

(dsl, fausse manip d'edit)


Message édité par blackgoddess le 19-12-2003 à 17:34:41

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 19-12-2003 à 17:33:51    

mmh ...
c'est pas possible que GC ne soit pas template ?
 
sinon, voila ce que j'ai essayé de faire, ca me poserait un problème de polymorphisme ?
 

Code :
  1. class gcObject
  2. {
  3. };
  4. struct A : gcObject
  5. {
  6. };
  7. template<typename T>
  8. struct gcRef
  9. {
  10.   void methode() { gcrefs.i=3; }
  11. };
  12. template<typename T>
  13. class GCrefs
  14. {
  15.   friend gcRef<T>;
  16.   int i;
  17. };
  18. GCrefs<gcObject*> gcrefs;
  19. void main()
  20. {
  21.   GCrefs<A*> test;
  22.   test.methode();
  23. }


 
le compilo me dit :
 
error C2248: 'gc::GCrefs<T>::i' : cannot access private member declared in class 'gc::GCrefs<T>'
        with
        [
            T=gc::gcObject *
        ]
        and
        [
            T=gc::gcObject *
        ]
ici : gcrefs.i=3;


Message édité par blackgoddess le 19-12-2003 à 17:35:14

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 19-12-2003 à 17:54:08    

Si tu veux que GC ne soit pas template, tu lui passe un type connu :

Code :
  1. class GC
  2. {
  3. friend gcRef<gcObject *>; // par exemple
  4. // ...  
  5. };


Mais c'est pas génial, il vaut mieux que GC soit template pour conserver la généricité.
 
Sinon ca ne serait pas plutot gcRef<A*> test; ?


Message édité par hellbilly le 19-12-2003 à 17:59:57
Reply

Marsh Posté le 19-12-2003 à 18:06:02    

gcRef<A*> test; >> oups oui, autant pour moi
 
sinon, chui nouille, je vais mettre le int i de GC refs en private static dans gcRef :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 19-12-2003 à 20:54:53    

si je comprends bien ... exemple à la con
 

Code :
  1. template<typename T>
  2. struct Foo
  3. {
  4.   void call() const;
  5. };
  6. template<typename T>
  7. struct Bar
  8. {
  9.   void call() const;
  10. };
  11. struct A
  12. {
  13.   template<typename T>
  14.   friend class Foo;
  15.   friend class Bar<int>;
  16. private:
  17.   void call() const { }
  18. };
  19.    
  20. template<typename T>
  21. void Foo<T>::call() const
  22. {
  23.   A().call();
  24. }
  25. template<typename T>
  26. void Bar<T>::call() const
  27. {
  28.   A().call();
  29. }
  30. int main()
  31. {
  32.   Foo<void>().call();
  33.   Foo<int>().call();
  34.   Bar<void>().call(); /* Erreur */
  35.   Bar<int>().call();
  36. }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed