Membervariable ist private für eine Memberfunktion
-
Hallo!
Folgendes:
template <class T> class foo { private: T val; public: template<class t> foo<T> operator=(foo<t> f) { val = static_cast<T>(f.val); return *this; } }; int main() { foo<int> a; foo<float> b; a = b; return 0; }Wenn ich das kompiliere bekomme ich folgenden Fehler:
test.cpp: In member function ‘foo<T> foo<T>::operator=(foo<t>) [with t = float, T = int]’: test.cpp:18: instantiated from here test.cpp:4: error: ‘float foo<float>::val’ is private test.cpp:9: error: within this contextWarum ist hier val für die Memberfunktion private? Wie kann ich die als friend deklarieren?
MfG
-
Schablonenmann schrieb:
Hallo!
Folgendes:
template <class T> class foo { private: T val; public: template<class t> foo<T> operator=(foo<t> f) { val = static_cast<T>(f.val); return *this; } }; int main() { foo<int> a; foo<float> b; a = b; return 0; }Wenn ich das kompiliere bekomme ich folgenden Fehler:
test.cpp: In member function ‘foo<T> foo<T>::operator=(foo<t>) [with t = float, T = int]’: test.cpp:18: instantiated from here test.cpp:4: error: ‘float foo<float>::val’ is private test.cpp:9: error: within this contextWarum ist hier val für die Memberfunktion private? Wie kann ich die als friend deklarieren?
MfG
foo<T> hat mit foo<t> nichts zu tun, wenn t != T - es sind dann zwei unabhängige Klassen wie irgendein Foo und Bar, die untereinander Zugriffskontrollen unterliegen. Eine Möglichkeit ist, jede Instanz von foo als friend jeder anderen Instanz von foo zu deklarieren:
template <class T> class foo { template<typename> friend class foo; ...Generell ist es aber besser, ein geeignetes öffentliches Interface bereitzustellen - auf irgendeine Weise muss der Wert val ja sowieso Bestandteil des Interfaces sein, wenn die Klasse einem Zweck dienen soll.
-
Vielen Dank!
camper schrieb:
Generell ist es aber besser, ein geeignetes öffentliches Interface bereitzustellen - auf irgendeine Weise muss der Wert val ja sowieso Bestandteil des Interfaces sein, wenn die Klasse einem Zweck dienen soll.
Mein obiges Beispiel war nur ein Minimal-Beispiel, bei dem der Fehler noch auftritt. Die eigentliche Klasse ist um einiges komplexer und hat auch ein sinnvolles Interface. Allerdings kein getval() od.ä., da der Benutzer nicht direkt auf val zugreifen soll. Abhängig von der Umgebung muss erst etwas umgerechnet werden.
-
Außerdem solltest du den Parameter als konstante Referenz übergeben:
template<class t> foo<T> operator=(const foo<t> &f)