friend + Template-Klasse
-
Hallo zusammen,
am besten zuerst kurz mein Quellcodeausschnitt und anschließend die Erklärung.
template < int I, int J, int K > class foo { template < int OtherI, int OtherJ > friend class foo<OtherI,OtherJ,K>; public: foo() { temp = 5; } template < int OtherI, int OtherJ > foo(foo<OtherI, OtherJ, K> const & ref) :temp (ref.temp) { } private: int temp; };Es geht um folgende Situation. Die Variable temp soll private deklariert sein und keine getter oder setter Funktionen besitzen. Gleichzeitig soll ein Konstruktur existieren, der ein Objekt der Template-Klasse foo entgegen nimmt, wo die Template-Parameter I,J unterschiedliche Werte gegenüber dem Klassen-Template besitzen kann, aber der Template-Parameter K gleich sein muss.
Mmmmh, irgendwie mit Worten doof zu beschreiben.
Der Compiler sagt mir: error: partial specialization 'foo<OtherI, OtherJ, K>' declared 'friend'
Hilft mir momentan aber nicht weiter.
Könnt ihr mir einen Tipp geben?
Viele Grüße
MM
-
Partielle Templatespezialisierungen als friends sind leider verboten. Ich weiß jetzt so aus dem Stand nicht, was der tiefere Grund dafür ist, ist aber so: Ganz spezialisiert oder gar nicht.
Somit ist auch die Lösung für dein Problem nicht gerade elegant: Mach das ganze template zum friend. Du kannst zusätzlich noch ein paar Compilezeit Assertions in den Konstruktor bauen, um sicherzugehen, dass die Templateparameter die von dir vorgegebenen Rahmenbedingungen erfüllen.