Własna implementacja szablonu stosu linker error
Ostatnio zmodyfikowano 2017-12-26 23:22
Masterpc16 Temat założony przez niniejszego użytkownika |
Własna implementacja szablonu stosu linker error » 2017-12-26 12:38:01 Witam stworzyłem własną implementację stosu.. Gdy zrobiłem ten stos na intach wszystko działało, zrobiłem go na szablonie i mam o to taki błąd /Applications/CLion.app/Contents/bin/cmake/bin/cmake --build /Users/michael.urban/CLionProjects/fraction/cmake-build-debug --target fraction -- -j 2 Scanning dependencies of target fraction [ 25%] Building CXX object CMakeFiles/fraction.dir/main.cpp.o [ 50%] Linking CXX executable fraction Undefined symbols for architecture x86_64: "MyStack<double>::MyStack()", referenced from: _main in main.cpp.o "MyStack<double>::~MyStack()", referenced from: _main in main.cpp.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make[3]: *** [fraction] Error 1 make[2]: *** [CMakeFiles/fraction.dir/all] Error 2 make[1]: *** [CMakeFiles/fraction.dir/rule] Error 2 make: *** [fraction] Error 2
Wszystko się kompiluje i działa ale nie wiem czemu dostaję taką wiadomość, google nie pomaga :( System operacyjny high sierra (macos) ide clion kompilator c++11 kod Plik MyStack.h #ifndef FRACTION_MYSTACK_H #define FRACTION_MYSTACK_H
#include <iostream> #include <stdexcept>
template <class T> class MyStack { struct Node { // node struct T key; // current value Node *next; // next node }; private: Node *top; // first element int size; // current stack size public: MyStack(); // default constructor ~MyStack(); // destructor
bool push(T key); // push element to stack T pop(); // take and delete first element from stack bool isEmpty(); // check if size equals 0 T& peek(); // take first element from stack void clear(); // clear stack };
#endif //FRACTION_MYSTACK_H
plik MyStack.cpp #include "../headers/MyStack.h"
// constructor
template <class T> MyStack<T>::MyStack() { top = NULL; size = 0; }
// destructor
template <class T> MyStack<T>::~MyStack() { while (top != NULL) { Node *temp = top; top = top->next; delete temp; } }
// methods
template <class T> bool MyStack<T>::push(T key) { Node *temp = new Node; temp->key = key; temp->next = top; top = temp; size++; return true; }
template <class T> T MyStack<T>::pop() { if (size != 0) { int temp = top->key; size--; top = top->next; return temp; } throw std::invalid_argument("stack is empty"); }
template <class T> bool MyStack<T>::isEmpty() { return size == 0; }
template <class T> T& MyStack<T>::peek() { if (size != 0) { return top->key; }
throw std::invalid_argument("stack is empty");
}
template <class T> void MyStack<T>::clear() { top = NULL; size = 0; }
w klasie testowej mam tylko MyStack <double>stack; |
|
pekfos |
» 2017-12-26 13:55:00 Implementacja szablonu musi być w pliku nagłówkowym. |
|
Masterpc16 Temat założony przez niniejszego użytkownika |
» 2017-12-26 14:37:12 Ciała metod mają być w pliku .h? zrobiłem wg poradnikatą implementację |
|
pekfos |
» 2017-12-26 14:41:02 Tak. |
|
Masterpc16 Temat założony przez niniejszego użytkownika |
» 2017-12-26 15:01:42 Potem poprawię i dam znać. Czemu nie można tego rozdzielić tak jak w tym poradniku? https://4programmers.net/C/Szablony_klas |
|
pekfos |
» 2017-12-26 15:04:43 Bo ten poradnik jest w błędzie. |
|
Masterpc16 Temat założony przez niniejszego użytkownika |
» 2017-12-26 23:22:13 Potwierdzam pekfos miał rację. WIELKIE DZIĘKI :) |
|
« 1 » |