Seite 1 von 1

[gelöst] templatisierte std::list

Verfasst: 3. Mai 2012 09:11
von PoetikBiker
Hallo zusammen,

Ich benutze MinGW unter Window XP, aktuelle Version. Nun habe ich folgendes Problem:

Ich habe eine eine Liste von std::list abgeleitet

Code: Alles auswählen

class qListI : public std::list<T>
Wenn ich diese Liste nun löschen möchte, geht folgender Code nicht:
Die Fehlermeldung lautet: error: there are no arguments to 'begin' that depend on a template parameter, so a declaration of 'begin' must be available

Code: Alles auswählen

template <class T>
void qListI<T>::Clear()
{
	erase(begin(), end());
}
Folgender Code funktioniert, so weit so gut:

Code: Alles auswählen

template <class T>
void qListI<T>::Clear()
{
	this->erase(this->begin(), this->end());
}
Frage 1) Kann mir jemand das verständlich erläutern? Ich bin C++ Anfänger...

Jetzt benötige ich eine Methode, um ein Element zu löschen:

Code: Alles auswählen

template <class T>
void qListI<T>::RemoveElement(const T  &_t)
{
	qListI<T>::iterator		this->it;      // <-------- wird nicht übersetzt
	for (this->it=this->begin(); this->it!=this->end(); this->it++)
	{
		if (*(this->it) == _t)
		{
			this->erase(this->it, this->it);
		}
	}
} 
Die markierte Zeile wird nicht übersetzt, Fehlermeldung:
error: need 'typename' before 'qBase::qListI<T>::iterator' because 'qBase::qListI<T>' is a dependent scope
..\qQt\/../qBase/Src/qListI.inl:119:24: error: expected ';' before 'this'


Frage 2) Wie kann ich die Methode formulieren, damit das geht? Wie gesagt... C++ Anfänger...


Vielen Dank für eure Hilfe

Re: templatisierte std::list

Verfasst: 3. Mai 2012 10:39
von franzf
Generell (und das solltest du beherzigen) sind die STL-Container nicht zum ABleiten gedacht. Alleine das Fehlen eines virtuellen Destruktors ist ein K.O.-Kriterium.
Du verwendest Ableitung jetzt um Schreibarbeit zu sparen - und dazu ist sie nicht gedacht! Du möchtest entweder freie Funktionen:

Code: Alles auswählen

template<typename T>
void clearList(std::list<T>& list);
(wobei ich DAS am allerwenigsten verstehe: was ist an list.erase(list.begin(), list.end()); so umständlich?)
Oder du willst ein std::list-Objekt in deiner Klasse wegkapseln.

Außerdem solltest du dir GUT überlegen, ob für dich std::list (also eine single-linked list) der Container der Wahl ist. std::vector ist DER Standard-Container. Wenn du nicht viele EInfügungen/Löschungen in der Mitte hast, oder du die Bedingung stellst, dass iteratoren nach Lösch/Einfüge-Operationen gültig bleiben, solltest du auch vector nehmen.

Zu den Problemen:
1) begin() hat keine Parameter, anhand denen der Copmiler sehen könnte, was damit zu tun ist (stichwort Name-Lookup). Das mit dem this-> ist die eine Möglichkeit (besser), die andere wäre std::list<T>::begin() - pass aber auf, weil das virtuelle Zugriffe (wäre begin() virtual) unterbindet, und auch bei Spezialisierungen von qListI<> dazwischenfunkt.

2) Ein Teil der Lösung steht ja schon da: typename ist erforderlich. Der Compiler weiß an der Stelle noch nicht, dass qListI<T>::iterator ein Typ ist - könnte ja auch ein Objekt sein! Deshalb musst du das explizit mit dem typename klarmachen.
Der andere Teil des Fehlers ist auch ohne templates kein gültiges C++:

Code: Alles auswählen

Typ t = this->variable; // Äh... this - hier? Du willst eine neue Variable deklarieren, die soll dannIM Objekt liegen?!?

Re: templatisierte std::list

Verfasst: 3. Mai 2012 17:22
von franzf
Da wohl der OP hier nicht mehr antworten will:
1) Cross-Post: http://www.c-plusplus.de/forum/302996
2) gelöst.

Bitte Cross-Postings in Zukunft vermeiden. Erst in einem Forum fragen, dann mindestens einen halben Tag warten, damit Leute Zeit haben zu antworten, wenn es arg eilt (kann ich hier beim besten Willen nicht erkennen) kann man danach in einem anderen Forum nachfragen und diesen Link im ersten Forum posten, ebenso im zweiten den Link zum ersten, damit Diskussionen zum Thema und Lösungsansätze allen Beteiligten Zugute kommen.Ansonsten ist es Verschwndung von "Hilfsmitteln".

Re: templatisierte std::list

Verfasst: 4. Mai 2012 10:13
von PoetikBiker
franzf hat geschrieben:Da wohl der OP hier nicht mehr antworten will:
1) Cross-Post: http://www.c-plusplus.de/forum/302996
2) gelöst.

Bitte Cross-Postings in Zukunft vermeiden....
OK, mache ich in Zukunft. Bin halt Neuling :oops:

Aber zwei allgemeine Fragen habe ich doch noch:
1) Was ist ein OP?
2) wie markiere ich einen Beitrag als gelöst?

Re: templatisierte std::list

Verfasst: 4. Mai 2012 10:28
von franzf
PoetikBiker hat geschrieben:OK, mache ich in Zukunft. Bin halt Neuling :oops:
Ok, kein Problem - jetzt weißt du es ja :)
Aber zwei allgemeine Fragen habe ich doch noch:
1) Was ist ein OP?
2) wie markiere ich einen Beitrag als gelöst?
1) Original Poster
2) Editiere deinen ersten Beitrag, und pass da den Titel an ([gelöst] o.Ä hinzufügen)