【问题标题】:I get an error when inheriting from a template class从模板类继承时出现错误
【发布时间】:2021-06-05 21:13:02
【问题描述】:

我正在尝试一个家庭作业项目,该项目需要我创建一个模板堆栈类,并且我必须将该类继承到另一个类中。整个项目工作正常,包括堆栈类。但是,一旦我包含了继承堆栈类的文件,编译器就找不到任何堆栈的函数定义,并且它说堆栈类模板已经被定义。 这是堆栈类结构:

#include<stdlib.h>
#include<iostream>

template <class T>
class Stack
{
public:
     Stack();
     ~Stack();
    T data;
    Stack* link;
    Stack* top;

    void push(T);
    bool isEmpty();
    T peek();
    void pop();
    void display();
};

template <class T>
Stack<T>::Stack()
{
}

template <class T>
Stack<T>::~Stack()
{
}

为了便于阅读,我不会在此处包含所有功能。

这是继承了我的堆栈和文件阅读器的类。

#pragma once
#include"infile.h"
#include"Node.h"

class Test: public infile, public Stack<char>
{

public:
    Test();
    ~Test();
    void output(char);
    void scan();
private:
    infile sequence;
    std::string s = "AACTAAT";
    int index;
    std::ofstream outfile;
    bool isString(int);
};

Test::Test()
{
    outfile.open("output.txt");//will just add to what is already in the file
}

Test::~Test()
{
    outfile.close();
}
void Test::scan() {

    Stack<char> mystack;
    //infile sequence;
    sequence.getfile();

    for (size_t i = 0; i < genome.length(); i++)
    {
        if (isString(i)) {
            std::cout << "Sequence found at " << i << " ";
        }
    }


}

bool Test::isString(int n) {

    if (s[0] == sequence.returnchar(n) && s[1] == sequence.returnchar(n + 1) && s[2] == sequence.returnchar(n + 2) && s[3] == sequence.returnchar(n + 3) && s[4] == sequence.returnchar(n + 4) && s[5] == sequence.returnchar(n + 5) && s[6] == sequence.returnchar(n + 6)) {
        return true;
    }
    else
        return false;

}

对于上下文,目标是使用一个类从文件中读取,并使用我创建的模板堆栈在文件中查找子字符串。就像我上面写的那样,在我包含我的 Test 类之前,该项目运行良好。

编辑:以前的错误已通过移动到三个文件系统得到修复,但现在出现了一个新错误。

template <class T>
class Stack
{
public:
    Stack();
    ~Stack();
    T data; // C2079 Stack<T>::data' uses undefined class 'T' 
    Stack* link;
    Stack* top;

    void push(T);
    bool isEmpty();
    T peek();
    void pop();
    void display();
};

代码有效,我继承的是 Stack 而不是 Stack

【问题讨论】:

  • 请显示您的编译命令,以及您收到的确切错误消息。
  • 从你的头文件中取出所有#include's 并将它们放入你的.cpp 文件中。我敢打赌它会编译。
  • @cigien 我刚刚在 Visual Studio 中点击了本地 Windows 调试器
  • @lakeweb 但是我的课程中不需要这些库来执行这些过程吗?我在这些头文件中也有我的实现。
  • 如果您将必要的包含放在 cpp 中的 you 标头前面,它们就会在那里。而带有class Test... 的第二组代码看起来像一个标题。如果没有定义的 inline 关键字,您将收到重复错误。不把包含在标题中总是可以的,我想不出一个例外。

标签: c++ templates inheritance


【解决方案1】:

首先,您的 Test 类看起来不应该继承 infileStack&lt;char&gt; 类。

提供 堆栈模板是在 Node.h 文件中定义的,然后我看不出编译器(链接器)找不到它的原因。也许包括确切的错误信息。

【讨论】:

  • 我的所有 Stack 方法的确切错误代码是 C2244,已定义 Stack 的 C2953,Stack 的 C2955 需要模板参数列表,而 Stack 的 C2512 没有适当的默认构造函数可用。另外,我必须继承这些类,这是任务的一部分。
  • 当我在我的 Test 类中创建 Stack mystack 时,我得到了 C2512
  • 如果您 100% 确定必须继承类,那么 Test 的实例 既是堆栈又是输入文件,因此您不应该将它们作为成员(或局部)变量。
猜你喜欢
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 2011-08-07
  • 2018-05-23
  • 2018-01-18
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多