使用mingw32-g ++编译代码块中的pj时遇到问题。
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED
template <class Type>
struct List
{
Type content;
List<Type> *head;
List<Type> *end;
};
template <class Type>
class Stack
{
public:
Stack();
~Stack(){};
void push(Type x);
void Del();
void shiftL();
void shiftR();
List<Type> *Front(){ return front; }
List<Type> *Back(){ return back; }
private:
List<Type> *front;
List<Type> *back;
List<Type> *operate;
List<Type> F;
List<Type> B;
int pos;
};
#endif // STACK_H_INCLUDED
#include"Stack.h"
#include<stdio.h>
template<class Type>
Stack<Type>::Stack()
{
F.head = B.end = NULL;
front = &F;
back = &B;
front->end = &B;
back->head = &F;
operate = back;
pos = 0;
}
template<class Type>
void Stack<Type>::Del()
{
if (pos>0)
{
List<Type>* temp;
temp = operate;
operate = operate->end;
operate->head = temp->head;
temp->head->end = operate;
pos--;
}
}
template<class Type>
void Stack<Type>::shiftL()
{
if (pos>0)
{
operate = operate->end;
pos--;
}
}
template<class Type>
void Stack<Type>::shiftR()
{
if (operate->head != front)
{
operate = operate->head;
pos++;
}
}
template<class Type>
void Stack<Type>::push(Type x)
{
List<Type>* temp;
temp = new List<Type>;
temp->content = x;
temp->end = operate;
temp->head = operate->head;
operate->head->end = temp;
operate->head = temp;
operate = operate->head;
pos++;
}
#include<stdio.h>
#include<iostream>
#include"Stack.h"
using namespace std;
int main()
{
char c;
int k;
cin >> k;
getchar();
for (int j = 0; j < k; j++)
{
Stack<char> password;
while (1)
{
c = getchar();
if (c == '\n')
break;
if (c == '<')
{
password.shiftL();
continue;
}
if (c == '>')
{
password.shiftR();
continue;
}
if (c == '-')
{
password.Del();
continue;
}
password.push(c);
}
List<char>* i;
for (i = password.Back()->head; i != password.Front(); i = i->head)
printf("%c", i->content);
printf("\n");
}
return 0;
}
mian.cpp
#include"Stack.cpp"
如果我在main.cpp中添加dict.items()
(这是非法的,对吗?),编译器不会显示任何错误或警告。
你能告诉我为什么吗?非常感谢! :)
答案 0 :(得分:0)
鉴于Stack
是一个模板,编译器无法在链接时生成它,它需要知道它将在编译时实例化的模板参数。
你有几种方法可以做到这一点。第一种是将函数定义移动到头文件中(或者等效地在头文件中包含合法的cpp文件)。 在Stack.h的末尾:
#include "Stack.cpp"
另一个是执行显式模板实例化,您可以告诉编译器所有可能在stack.cpp
中使用的模板参数,然后允许它在编译时生成它们并正常链接。在Stack.cpp
:
template class Stack<char>;