Реализация стека

Что значит ошибка undefined reference to `Stack::push(custumer&)

Stack.h

#pragma once
#include <iostream>
#include <string>
using namespace std;

struct custumer {
    char fullname[35];
    double payment;
};

typedef custumer Item;

template <typename T> class Stack {
private:
    T* stack; // массив указателей на стек
    int size;
public:
    Stack() { // консуктор по умолчанию
        stack = NULL;
        int top = 0;
    }

    ~Stack() {
        if (size > 0)
            delete[] stack;
    }

    int isempty();
    bool push(T& item);
    T pop();
    int size_stack();
    T head();
    void Print();
};

Stack.cpp

#include <iostream>
#include <string>
#include "Stack.h"
using namespace std;

template <typename T>
int Stack<T>::isempty() {
    return size == 0;
}

template <typename T>
bool Stack<T>::push(T& item) {
    T* buffer; // буффер для данных из stack
    buffer = stack;
    stack = new T[size + 1]; // выделяем память на 1 элемент больше чем было
    if (stack == NULL) {
        cout << "Error\n";
        return false;
    }
    for (int i = 0; i < size - 1; i++) {
        stack[i] = buffer[i];
    }
    stack[size] = item;
    size++; // увеличваем количество элементов
    if (size > 0)
        delete[] buffer;
    return true;
}

template <typename T>
int Stack<T>::size_stack() {
    return size;
}

template<typename T>
T Stack<T>::pop() {
    if (size == 0) // стек пуст
        return 0;
    size--;
    return stack[size];
}

template<typename T>
T Stack<T>::head() {
    if (size == 0)
        return 0;
    return stack[size - 1];
}

template<typename T>
void Stack<T>::Print() {
    T* buff; // указатель для продвижения по стеку
    buff = stack;
    cout << "Stack" << endl;
    if (size == 0)
        cout << "Stack is empty" << endl;
    for (int i = 0; i < size; i++) {
        cout << "items[" << i << "] = " << *buff << endl;
    }
    cout << endl;
}

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

Автор решения: AlexGlebe

Ошибка undefined reference to Stack::push(custumer&) означает, что шаблонной функции для класса Stack<custumer> не было скомпилировано.

Шаблоны не создают код. В момент использования какой-либо шаблонной функции проверяется, реализован ли этот код. И если ещё нет, то компилятор всё сделает.

Ваш код в Stack.cpp не в несёт никакого кода, так как эти функции не используются.

Обычно решают это внесением всех функций от шаблонов в хедеры. Чтобы при каждом отдельном компилированном .cpp файле была возможность сгенерировать ещё код для данного случая. Переименуйте Stack.cpp в Stack-private.h и подключите его в Stack.h.

Stack.h

...
# include "Stack-private.h"

Вторым вариантом будет предварительное объявление специализации в Stack.cpp. Но это будет обязывать прописывать каждый экземпляр шаблона.

Stack.cpp

...
template
class Stack<custumer>;
→ Ссылка