Bekomme warnings nicht entfernt
-
Unter Linux versuche ich mit dem gcc 3.3.5. eine Templateklasse zu compilieren, mein 7bener Visual Studio compiliert das Ganze selbst auf Warning Level 4 ohne Murren. Der Code wurde ursprünglich mit einem älteren gcc erstellt und sorgt jetzt überall dort, wo die std::map verwendet wird, für Warnungen.
Hier ein Beispiel:
Code:
template <class TKEY, class TDATA> class Container { public: bool entry(const TKEY &key, const TDATA &data) { pair<map<const TKEY, TDATA, compare>::iterator, bool> P = m_container.insert(pair<TKEY const, TDATA>(key, data)); return P.second; } // [...] private: struct compare { bool operator()(const TKEY k1, const TKEY k2) const { return (k1 < k2); } }; // [...] };Die Fehlermeldungen zu der pair-Zeile:
**gcc 3.3.5
warning:`std::map<const TKEY, TDATA, Container<TKEY, TDATA>::compare,
std::allocator<std::pair<const _Key, _Tp> > >::iterator'is implicitly a typename
**Sowie
**
gcc 3.3.5
warning: implicit typename is deprecated, please see the documentation for details
**Wäre nett, wenn mir jemanden sagen könnte wodurch diese Warnungen ausgelöst werden und wie ich sie wegbekomme :).
-
template <class TKEY, class TDATA> class Container { public: bool entry(const TKEY &key, const TDATA &data) { pair<typename map<const TKEY, TDATA, compare>::iterator, bool> P = m_container.insert(pair<TKEY const, TDATA>(key, data)); return P.second; } ....sollte es tun. Grund dafür ist, dass abhängige Namen (Namen die von Templateparametern abhängen) grundsätzlich nicht als Typnamen betrachtet werden. Es sei denn, Du schreibst typename davor (mit Ausnahme eines hier nicht wichtigen Falls).
map<const TKEY, TDATA, compare>::iterator ist so ein Fall. Genaugenommen ist es nicht nur eine Warning, sondern ein Fehler.
Auch wenn der Compiler es letztendlich beim Einsetzen des Template-Codes weiß, dass ein Typname gemeint sein muss, musst Du ihm der Regel nach trotzdem sagen, dass Du auch wirklich einen Typnamen meinst.Du könntest z.B. map für die beiden Typen so spezialisiert haben, dass map<Key,Data>::iterator plötzlich ein statisches Member oder sonstwas ist.
-
Danke sehr, Problem gelöst
