Ссылка на неразрешенный внешний символ Stack

Пишу класс для стека. Stack.h

    #pragma once

template<class T>
class Stack {
private:
    T *elements = new T[0];
    int length = 0;

public:
    template <typename U>
    friend Stack<U> & operator*(int x, Stack<U>& s);

    Stack & operator+(Stack<T> &t);
    Stack & operator*(int x);

    Stack(T *elems = nullptr, int len = 0);

    T push(T elem);
    T pull();
    bool empty();

    ~Stack();
};

template<class U>
Stack<U> & operator*(int x, Stack<U> & s) {
    s.operator*(x);

    return s;
};

Stack.cpp

#include "Stack.h"

template<class T>
Stack<T> & Stack<T>::operator+(Stack<T> &t) {
    while (!t.empty()) {
        push(t.pull());
    }

    return *this;
};

template<class T>
Stack<T> & Stack<T>::operator*(int x) {
    int l = this->length;
    T *els = new T[l];

    for (int i = 0; i < l; i++)
        els[i] = *(this->elements + i);

    for (int j = 1; j < x; j++)
        for (int i = 0; i < l; i++)
            this->push(*(els + i));

    return *this;
};

template<class T>
Stack<T>::Stack(T *elems, int len) : length(len), elements(elems) {};

template<class T>
T Stack<T>::push(T elem) {
    T *el = new T[length + 1];

    for (int i = 0; i < length; i++) {
        el[i] = this->elements[i];
    }

    el[this->length] = elem;
    this->length++;

    delete[] this->elements;
    this->elements = el;

    return elem;
};

template<class T>
T Stack<T>::pull() {
    if (length <= 0) {
        throw "Error";
    }

    return this->elements[--this->length];
};

template<class T>
bool Stack<T>::empty() {
    return this->length == 0;
};

template<class T>
Stack<T>::~Stack() {
    delete[] this->elements;
};

main.cpp

#include <iostream>
#include "Stack.h"

using namespace std;

int main()
{
    setlocale(LC_ALL, "RU_ru");

    int *a = new int[3];
    a[0] = 2;
    a[1] = 5;
    a[2] = 10;

    Stack<int> s1(a, 3);
    Stack<double> s2;

    s1.push(2);
    s1.push(4);
    s1.push(25);

    Stack<int> s3;
    s3.push(88);

    s1 = s1 + s3;
    s1 = s1 * 2;
    s1 = 2 * s1;

    s2.push(3.1);
    s2.push(4.4);
    s2.push(5.8);
    s2.push(4.6);


    cout << "Stack 1" << endl;
    while (!s1.empty()) {
        cout << s1.pull() << endl;
    }

    cout << "Stack 2" << endl;
    while (!s2.empty()) {
        cout << s2.pull() << endl;
    }
}

При компиляции на любую операцию стека(конструктор, пуш, пул, деструктор) выдает "Ссылка на неразрешенный внешний символ". Но когда я описываю класс в том же файле, то всё работает


Ответы (0 шт):