[C++} o co chodzi kompilatorowi?


(Wojtekgadzinski) #1

Mój problem polega na tym, że wprowadziłem (typedef Node Node;) i zamieniłem wszędzie w kodzie Node na Node tylko, że pojawił się błąd gdy jakaś metoda zwraca Node** wcześniej cały kod się kompilował i działał poprawnie, a typedef będzie mi potrzebny przy rozwijaniu projektu i zastanawiam się dlaczego kompilator krzyczy mi przy implementacji metody Node** BSTreeAVL::FindNode(const K& key)

takie coś:

expected constructor, destructor, or type conversion before '*' token

taki sam rezultat jest przy metodzie Node** BSTreeAVL::MinMaxNode(Node** n, bool m) ( przy tej lini) mam taki kod:

template

        class BSTreeAVL

        {

            typedef Node Node; // to dodałem


            // cos ...


            public:

                BSTreeAVL();

                ~BSTreeAVL();


                // cos ...


            private:

                int count;

                Node* main_node;


                Node** FindNode(const K& key);

                Node**MinMaxNode(Node** n, bool m);

                void DeleteNode(Node** n);

        };

i mam jeszcze taki kod:

template

            Node** BSTreeAVL::FindNode(const K& key) // tutaj krzyczy

            {

                Node** nd = &main_node;


                while(*nd != 0 && (*nd)->getKey() != key)                

                nd = key < (*nd)->getKey() ? (*nd)->getLeft() : (*nd)->getRight();


            if (*nd == 0) throw NotFoundKeyException("Klucz nie istnieje");

            return nd;

            }


 template

            Node**BSTreeAVL::MinMaxNode(Node** n, bool m) // tutaj też

            {

                Node** nd = n;

                if (m)

                    while(*(*nd)->getLeft() != 0)

                            nd = (*nd)->getLeft();

                else

                    while(*(*nd)->getRight() != 0)

                            nd = (*nd)->getRight();

                return nd;

            }

proszę o pomoc w rozwiązaniu problemu :slight_smile:


([alex]) #2

może miałeś na myśli:

typedef BSTreeAVL Node;

?


(Wojtekgadzinski) #3

Nie, ponieważe Node to jest węzeł drzewa, a BSTreeAVL to jest całe drzewo razem z interfejsem do jego obsłógi, a powyższe funkcje mają wyszukiwać w odpowiedni sposób węzły i je zwracać a konkretniej wskaźniki do wskaźników do tych węzłów (bardzo to pomaga w przełączaniu węzłów) problem polega jakoś na tym że kompilator nie trawi wskaźników do wskaźników do typu nazwanego typedefem i które są zwracane przez funkcje, nie wiadomo dlaczego.


(Sawyer47) #4

A gdzie masz zadeklarowany ten typ Node?

Co do kodu, to mi się wydaje (na pamięć standardu C++ nie znam, a i w C++ dawno nie pisałem, zgaduję raczej), że typedef Node obowiązuje tylko w zakresie klasy. Metody definiujesz już poza, więc chyba trzeba napisać

BSTreeAVL::Node** BSTreeAVL::metoda... Być może też kłócą się nazwy Node z tym typedefem Node - spróbuj zmienić nazwę na jakąś inną (jeśli pierwsza rada nie zadziała)


([alex]) #5

Nie możesz mieć zmiennej o nazwie Node typu Node tak samo jak nie możesz mieć zmiennej o nazwie "int".


(Marcin 110) #6
template

            Node** BSTreeAVL::FindNode(const K& key) // tutaj krzyczy

powinno wyglądać tak:

template

            typename BSTree::Node** BSTreeAVL::FindNode(const K& key)

Poniżej prosty przykład ilustrujący zjawisko:

#include 
#include 

template<typename T>
class foo {
public:
  typedef std::pair<T, int> pair;
  pair member;
  pair bar();
};

template<typename T>
typename foo<T>::pair foo<T>::bar()
{        /*buuu*/
  pair works_here;
  return member;
}

int main()
{
  foo<std::string> a;
  a.member = std::make_pair("blabla", 1);
  a.member = foo<std::string>::pair("blabla", 1);
  return 0;
}
 [/code]

int jest słowem kluczowym, dlatego nie można mieć zmiennej o nazwie int, ale Node (a nawet jednocześnie typie Node) już tak. Tak w ogóle, to gdzie tam widzisz tę zmienną?


([alex]) #7

Tu masz deklaracje typu Node przez typ Node - to nie przejdzie. Proszę nie mylić z:

bo tu typ pair deklarowany przez std::pair.