wzorzec wewnątrz wzorca?

0

dzien dobry, mam taki kod #include <iostream>
#include <list>
#include <vector>
using namespace std;

template<class K>
struct krawedz {
krawedz(int U, int V, K wart) : u(U), v(V), wartosc(wart) {}
int u;
int v;
K wartosc;
};

template<class K>
class graf {
public:
inline void dodaj_element() { if (elementy.empty()) elementy.push_back(0); else elementy.push_back(elementy.back()++); }
inline void dodaj_krawedz(int u, int v, K wart) { krawedzie.push_back(krawedz<K>(u,v,wart)); }

void wyswietl() const;

private:
list<int> elementy;
list<krawedz<K> > krawedzie;
};

template<class K>
void graf<K>::wyswietl() const {
list<krawedz<K> >::const_iterator i;
// for (list<krawedz<K> >::iterator i=krawedzie.begin(); i!=krawedzie.end(); ++i)
// cout << (*i).u << " " << (*i).wart << " " << (*i).v << endl;
}


niestety, blad kompilacji pojawia sę przy funkcji wyswietl, zmiana K na int umozliwila kompilację, wnioskuję więc, że jest jakiś problem z przekazaniem dalej wzorca. da się to jakos poprawić?
0

Napisałbyś jaki błąd...

0
sprzedamsanki napisał(a)

Napisałbyś jaki błąd...

"ComeauTest.c", line 29: error: expected a ";" (perhaps on the previous statement)
      list<krawedz<K> >::const_iterator itt=krawedzie.begin();
                                        ^

1 error detected in the compilation of "ComeauTest.c".
0

typename list<krawedz<K> >::const_iterator i;

0

dlaczego tak?

0

Dlatego, że odwołujesz się do składowej szablonu, który nie jest konkretny, typename wskazuje, że ta składowa to typ. To w takim zrozumiałym uproszczeniu.

0

nie jest konkretny, bo do konkretyzacji potrzebna jest zmienna K, która jest nieznana w momencie kompilacji?

0

Nie potrafi złożyć konkretnego typu bo parametru nie zna w miejscu definicji funkcji (a właściwie użycia w niej).

0

w uproszczeniu rozumiem :)

dziękuję bardzo,
pozdrawiam, Michal

0

w detalach: problem tkwi w czymś, co zwie się 'dependent/nondependent' names

z powodu sposobu w jaki template'y dzialaja, jesli w template<K> sprobujesz sie odniesc do K::cokolwiek albo bum<K>::cokolwiek albo bum<ble<K>>::cokolwiek albo ..., to kompilator analizujac nazwe 'cokolwiek' nie jest w stanie domyslic sie, czym ono jest -- moze byc metoda, moze byc polem/stałą, może być subclassą, itp itp. z tego powodu, tam gdzie chcesz faktycznie użyć TYPU a nie jakiejs konkretnej statycznej zawartości klasy, powinienes kompilatorowi podpowiedziec ze ta nazwa jest TYPEM a nie czyms innym -> stad keyword typename.

imho, ładniej opisane jest na http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18

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