Функции-члены шаблонного класса, которые принимают тип шаблона в качестве аргумента - PullRequest
1 голос
/ 01 марта 2011

У меня есть структура узла и класс стека.Когда я помещаю определение для 'void Push (T data)' вне определения класса, я получаю:

error: 'template<class T> class Stack' used without template parameters

Но когда я помещаю его в определение класса, оно отлично работает.
Вот код:

template <class T>
struct Node
{
    Node(T data, Node <T> * address) : Data(data), p_Next(address) {}
    T Data;
    Node <T> * p_Next;
};

template <class T> 
class Stack
{
public:

    Stack() : size(0) {}
    void Push(T data);
    T Pop();

private:
    int size;
    Node <T> * p_first;
    Node <T> * p_last;  
};

Реализация для Push (T data):

void Stack::Push(T data)
{
    Node <T> * newNode;   

    if(size==0)
        newNode = new Node <T> (data, NULL);
    else
        newNode = new Node <T> (data, p_last);

    size++;
    p_last = newNode;
}

Редактировать: Решения работали, за исключением того, что теперь я получаю ошибку компоновки всякий раз, когда пытаюсь вызвать функции.

Stack<int>::Pop", referenced from   
_main in main.o   
symbol(s) not found.

, если определения не в Stack.h вместо Stack.cpp

Ответы [ 3 ]

4 голосов
/ 01 марта 2011

Вам нужно добавить оператор шаблона перед функциями-членами, если они определены вне класса ...

template <class T>
void Stack<T>::Push(T data)
{
    Node <T> * newNode;   

    if(size==0)
        newNode = new Node <T> (data, NULL);
    else
        newNode = new Node <T> (data, p_last);

    size++;
    p_last = newNode;
}

(по крайней мере, так должно быть.)

4 голосов
/ 01 марта 2011

Вам нужно снова использовать template <class T> (а затем снова использовать это T в качестве параметра шаблона для класса):

template <class T>
void Stack<T>::Push(T data)
{
    Node <T> * newNode;   

    if(size==0)
        newNode = new Node <T> (data, NULL);
    else
        newNode = new Node <T> (data, p_last);

    size++;
    p_last = newNode;
}
2 голосов
/ 01 марта 2011

Это потому, что когда определение находится внутри определения класса, оно знает параметр шаблона.Если вы хотите поместить определение вне, вам нужно явно указать компилятору, что T является параметром шаблона ...

template <class T>
void Stack<T>::Push(T data) {/* code */}
...