Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Własna implementacja szablonu stosu linker error

Ostatnio zmodyfikowano 2017-12-26 23:22
Autor Wiadomość
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;
P-168120
pekfos
» 2017-12-26 13:55:00
Implementacja szablonu musi być w pliku nagłówkowym.
P-168121
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ę
P-168122
pekfos
» 2017-12-26 14:41:02
Tak.
P-168124
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
P-168125
pekfos
» 2017-12-26 15:04:43
Bo ten poradnik jest w błędzie.
P-168126
Masterpc16
Temat założony przez niniejszego użytkownika
» 2017-12-26 23:22:13
Potwierdzam pekfos miał rację. WIELKIE DZIĘKI :)
P-168136
« 1 »
  Strona 1 z 1