模板类的成员函数,它将模板类型作为参数

时间:2011-03-01 03:16:30

标签: c++ templates function types member

我有一个节点结构和堆栈类。当我将'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数据)的实现是:

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 个答案:

答案 0 :(得分:4)

您需要再次使用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;
}

答案 1 :(得分:4)

您需要在成员函数之前添加模板语句(在类外部定义...

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 :(得分:2)

那是因为当定义在类定义中时,它知道模板参数。如果要将定义放在外面,则需要明确告诉编译器T是模板参数...

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