Liczba postów: 155
Liczba wątków: 37
Dołączył: 01.02.2011
22.03.2019, 18:43
(Ten post był ostatnio modyfikowany: 22.03.2019, 18:49 przez Physicist.)
Klasa wewnętrzna w C++
Witam. Mam dość dziwny problem ze zdefiniowaniem funkcji, której jako wartość zwracaną chcę ustawić wskaźnik do obiektu klasy wewnętrznej. Dziwny ponieważ gdy zdefiniuję funkcję wewnątrz klasy (tej zewnętrznej, będącej szablonem) to kompilator nie widzi żadnego błędu, natomiast gdy wewnątrz w/w klasy funkcję tylko zadeklaruję to kompilator znajduje błąd przy próbie definicji funkcji na zewnątrz. Obrazowo wygląda to mniej więcej tak:
template <typename typ>
class bt
{
class node
{
typ value;
};
node* fun(typ x, node* und); //deklaracja funkcji
};
template <typename typ>
node* bt<typ>::fun(typ x, node* und) //tej linijki kompilator się czepia mówiąc: 'node does not name a type, //lecz gdy zdefiniuję funkcję wewnątrz klasy bt<> to wszystko jest ok... dlaczego?
{
definicja....
}
(Używam DEV C++)
Liczba postów: 2465
Liczba wątków: 17
Dołączył: 12.11.2007
23.03.2019, 08:03
RE: Klasa wewnętrzna w C++
Witam, klasa
node nie jest widoczna, dlatego trzeba jawnie się do niej odwołać:
Kod:
template <typename T>
class bt
{
class node
{
T value;
};
node* fun(T x, node* und); //deklaracja funkcji
};
template <typename T>
typename bt<T>::node* bt<T>::fun(T x, node* und)
{
}
Liczba postów: 155
Liczba wątków: 37
Dołączył: 01.02.2011
23.03.2019, 16:08
RE: Klasa wewnętrzna w C++
I tu mnie właśnie zastanawia dlaczego nie jest widoczna w definicji funkcji, która została zadeklarowana w miejscu dostrzegającym definicję klasy
node ? Natomiast w tym samym ciele tej samej funkcji, lecz owszem- zdefiniowanej w zakresie, w którym klasa
node jest widoczna, błędu już żadnego nie ma. Kompilator nie widzi/nie rozumie zapisu:
node*
bt<typ>::fun(typ x, node* und) (gdzie podany jest operator zakresu wyraźnie zaznaczający, o którą funkcję której klasy chodzi)? Byłbym bardzo wdzięczny za fachowe wytłumaczenie bo mi to nie daje spać
Liczba postów: 2465
Liczba wątków: 17
Dołączył: 12.11.2007
23.03.2019, 16:40
RE: Klasa wewnętrzna w C++
Definicja klasy node znajduje się wewnątrz klasy bt, dlatego trzeba się jawnie odwołać do niej - samo jawne odwołanie się do metody fun nie rozwiązuje sprawy.
Liczba postów: 155
Liczba wątków: 37
Dołączył: 01.02.2011
23.03.2019, 18:28
RE: Klasa wewnętrzna w C++
Byłem przekonany, że skoro jest to funkcja klasy zewnętrznej (czyli znająca klasę wewnętrzną

) to jej ciało może wyglądać tak samo wewnątrz jak i na zewnątrz tej klasy
bt. Dodam, że przy próbach definiowania testowałem formuły typu:
template <typename typ>
node* bt<typ>::fun(typ x, node* und)...
template <typename typ>
bt<typ>::node* bt<typ>::fun(typ x, node* und)...
template <typename typ>
bt<int>::node* bt<typ>::fun(typ x, node* und)...
template <typename typ>
bt<typ>.node* bt<typ>::fun(typ x, node* und)...
i chyba jeszcze parę innych, lecz przez myśl mi nie przeszło, że w linijce nazwy tej funkcji (na zewnątrz klasy) przy definiowaniu musi się powtórzyć słowo kluczowe
typename 
Wielkie dzięki za pomoc