C++模板错误

问题描述:

Possible Duplicate:
Undefined reference error for template methodC++模板错误

你好,我有这样的代码是给我这个错误:

未定义的参考`MyStack ::推(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; 
} 
+1

顺便说一句,你还需要在构造函数中可能使用它之前,你的初始化计数变量。 – 2011-04-27 09:16:46

+0

谢谢!我确实注意到需要初始化,但是我想解决这个问题非常糟糕,因为它让我感到不安,哈哈。 – petermlm 2011-04-27 12:49:00

类模板成员的定义必须在相同的文件,但您已将其定义在不同的文件中(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 */ 

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

+1

谢谢!我只是写在.h文件中的一切,哈哈! – petermlm 2011-04-27 12:50:00

您必须将您的模板类声明和实现放在头文件中,因为在编译时实例化模板时编译器需要了解模板实现。试着把执行MyStack里面MyStack.h

你可以找到更详细的解释here。只需转到文章开头的“模板和多文件项目”。