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;
}
答
类模板成员的定义必须在相同的文件,但您已将其定义在不同的文件中(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。只需转到文章开头的“模板和多文件项目”。
顺便说一句,你还需要在构造函数中可能使用它之前,你的初始化计数变量。 – 2011-04-27 09:16:46
谢谢!我确实注意到需要初始化,但是我想解决这个问题非常糟糕,因为它让我感到不安,哈哈。 – petermlm 2011-04-27 12:49:00