-1

Что значит ошибка 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 &gt; 0)
        delete[] stack;
}

int isempty();
bool push(T&amp; 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 Answers1

0

Ошибка 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>;
AlexGlebe
  • 17,227