未定义的引用`Stack <char> :: Stack()&#39;

时间:2016-10-18 14:49:55

标签: c++

使用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

Stack.h

#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++;
}

Stack.cpp

#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()(这是非法的,对吗?),编译器不会显示任何错误或警告。
你能告诉我为什么吗?非常感谢! :)

1 个答案:

答案 0 :(得分:0)

鉴于Stack是一个模板,编译器无法在链接时生成它,它需要知道它将在编译时实例化的模板参数。

你有几种方法可以做到这一点。第一种是将函数定义移动到头文件中(或者等效地在头文件中包含合法的cpp文件)。 在Stack.h的末尾:

#include "Stack.cpp"

另一个是执行显式模板实例化,您可以告诉编译器所有可能在stack.cpp中使用的模板参数,然后允许它在编译时生成它们并正常链接。在Stack.cpp

结束时
template class Stack<char>;