Possible Duplicate:
Undefined reference error for template method




您好,我有此代码给我这个错误:

未定义对MyStack :: push(int)main.cpp的引用

为什么??

MyStack.h:

#ifndef STACK_H
#define STACK_H

template <typename T>
class MyStack
{
private:
    T *stack_array;
    int count;

public:
    void push(T x);
    void pop(T x);

    void xd(){}
};

#endif /* STACK_H */


MyStack.cpp:

#include "mystack.h"

template <typename T>
void MyStack<T>::push(T x)
{
    T *temp;
    temp = new T[count];

    for(int i=0; i<count; i++)
        temp[i] = stack_array[i];

    count++;

    delete stack_array;
    stack_array = new T[count];

    for(int i=0; i<count-1; i++)
        stack_array[i] = temp[i];
    stack_array[count-1] = x;
}

template <typename T>
void MyStack<T>::pop(T x)
{

}


main.cpp:

#include <iostream>

#include "mystack.h"

using namespace std;

int main(int argc, char *argv[])
{
    MyStack<int> s;
    s.push(1);
    return 0;
}

最佳答案

类模板成员的定义必须在同一文件中,但是您已在其他文件(MyStack.cpp)中对其进行了定义。

一个简单的解决方案是,在MyStack.h文件的末尾添加以下行:

#include "MyStack.cpp" // at the end of the file


我知道这是.cpp文件,但是可以解决您的问题。

也就是说,您的MyStack.h应该如下所示:

#ifndef STACK_H
#define STACK_H

template <typename T>
class MyStack
{
private:
    T *stack_array;
    int count;

public:
    void push(T x);
    void pop(T x);

    void xd(){}
};

#include "MyStack.cpp" // at the end of the file

#endif /* STACK_H */


如果这样做,则#include "mystack.h"中不再需要MyStack.cpp。您可以删除它。

10-08 11:00