[C++] template, list? a moze problem z czyms innym?

0

Mam takie sobie fragmenty programu.

lisc.hpp

#ifndef _LISC_HPP_
#define _LISC_HPP_

#include <iostream>
using namespace std;
#include <string>
#include <list>

#include "klasa.hpp"

template <class T>
class lisc : public klasa
{
	list< T* > lista_obiektow;
	public:
		lisc( string nazwa, int numer );
		void dodaj_obiekt( string nazwa_obiektu );
		void usun_obiekt( string nazwa );
};

#endif

lisc.cpp

#include "lisc.hpp"

template <class T>
lisc<T>::lisc( string nazwa, int numer ) : klasa( nazwa, numer )
{
	//
}

template <class T>
void lisc<T>::dodaj_obiekt( string nazwa_obiektu )
{
	T *wsk;
	wsk = new T( nazwa_obiektu );
	lista_obiektow.push_back( wsk );
}

template <class T>
void lisc<T>::usun_obiekt( string nazwa )
{
	for(list< T* >::iterator i = lista_obiektow.begin(); i != lista_obiektow.end(); i++)  // linia 22
	{
		if ( (*i)->podaj_nazwe_obiektu() == nazwa)
		{
			delete (*i);
			lista_obiektow.erase(i);
			break;
		}
	}
}

main.cpp

#include <iostream>
using namespace std;
#include <string>

#include "../class/KlasaE.hpp"
#include "../class/lisc.hpp"

main ()
{
	lisc<E> obiekt("KlasaE", 5);
}

Przy kompilacji dostaje errory

../class/lisc.cpp: In member function ‘void lisc<T>::usun_obiekt(std::string)’:
../class/lisc.cpp:22: error: expected ‘;’ before ‘i’
../class/lisc.cpp:22: error: ‘i’ was not declared in this scope

Dodam, ze kiedy podam w kodzie klase bez uzycia template, to dziala elegancko.

edit: przepraszam, ale kod mi sie w lisc.cpp przesunal po usunieciu paru zbednych komentarzy, oznaczylem linie 22.

0

../class/lisc.cpp error: expected ‘;’ before ‘i’
../class/lisc.cpp error: ‘i’ was not declared in this scope
zjadłeś w 22 lini ; przed i
i 2 błąd to i nie jest tam zdeklarowane

0
Gelldur napisał(a)

../class/lisc.cpp error: expected ‘;’ before ‘i’
../class/lisc.cpp error: ‘i’ was not declared in this scope
zjadłeś w 22 lini ; przed i
i 2 błąd to i nie jest tam zdeklarowane

for(list< T* >::iterator i = lista_obiektow.begin(); i != lista_obiektow.end(); i++)

list< T* >::iterator i
to nie jest deklaracja i?

no i gdzie wg. Ciebie brakuje tam srednika?

0

Po pierwsze gdzie typ zwracany main? To nie stare C, pisz int main.

Dalej, szablonów nie rozdziela się na deklarację i implementację (chyba, że masz kompilator wspierający export, a nie masz) - umieść zawartość lisc.cpp w lisc.hpp, ciała metod musą być widoczne w każdej jednostce kompilacji.

Gelldur jak zwykle nie wie o co chodzi. Posługujesz się szablonem listy bez konkretnego typu - kompilator w tym momencie nie zna dokładnie składowych, w takich sytuacjach typ szablonowy poprzedza się słowem kluczowym typename:

 for(typename list<T*>::iterator i = lista_obiektow.begin(); i != lista_obiektow.end(); i++)

Po tych poprawkach powinno się kompilować.

0

pieknie smiga, wielkie dzieki :)

0

ja tylko napisałem co kompilator mu napisał myślałem ,że nie wie o co kaman :P btw wiem o co chodzi

1 użytkowników online, w tym zalogowanych: 0, gości: 1