Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ';PolishStack&x27;不是类模板,虚拟函数重影错误_C++_Class_Templates - Fatal编程技术网

C++ ';PolishStack&x27;不是类模板,虚拟函数重影错误

C++ ';PolishStack&x27;不是类模板,虚拟函数重影错误,c++,class,templates,C++,Class,Templates,我在实现基于抽象父类的类时遇到一些问题。它说PolishStack是一个抽象类,尽管所有虚拟函数都经过编码: In file included from braincalc.cpp:10: ./polstack.h:15:7: error: explicit specialization of non-template class 'PolishStack' class PolishStack<T> : public AbstractStack<T> { ^

我在实现基于抽象父类的类时遇到一些问题。它说PolishStack是一个抽象类,尽管所有虚拟函数都经过编码:

In file included from braincalc.cpp:10:
./polstack.h:15:7: error: explicit specialization of non-template class 'PolishStack'
class PolishStack<T> : public AbstractStack<T> {
      ^          ~~~
braincalc.cpp:13:21: error: variable type 'PolishStack<char>' is an abstract class
        PolishStack <char> stk;
                           ^
./abstractstack.h:53:16: note: unimplemented pure virtual method 'isEmpty' in
      'PolishStack'
  virtual bool isEmpty() const = 0;
包含在braincalc.cpp:10中的文件中:
./polstack.h:15:7:错误:非模板类“PolishStack”的显式专门化
类PolishStack:公共抽象堆栈{
^          ~~~
braincalc.cpp:13:21:错误:变量类型'PolishStack'是一个抽象类
PolishStack stk;
^
./abstractstack.h:53:16:注:中未实现的纯虚方法“isEmpty”
“PolishStack”
虚拟布尔isEmpty()常量=0;
这是我的课程标题:

#ifndef POLSTACK_H
#define POLSTACK_H

#include <iostream>
using namespace std;

#include "abstractstack.h"


template <typename T>
class PolishStack<T> : public AbstractStack<T> {
        T* data;
        int mMax;
        int mTop;

        public:

                PolishStack();

                bool isEmpty();

                const T& top() const throw (Oops);

                void push(const T& x);

                void pop();

                void clear();

                //my funcs:

                void printStack();


                ~PolishStack();
};

#endif
#如果不使用POLSTACK#
#定义POLSTACK_H
#包括
使用名称空间std;
#包括“abstractstack.h”
模板
类PolishStack:公共抽象堆栈{
T*数据;
int-mMax;
int mTop;
公众:
PolishStack();
bool是空的();
常量T&top()常量抛出(Oops);
无效推力(常数T&x);
void pop();
无效清除();
//我的职责:
void printStack();
~PolishStack();
};
#恩迪夫
我不想因为其他学生作弊而泄露我所有的代码,所以我将发布错误所抱怨的函数:

#include "polstack.h"

//...

template <typename T>
bool PolishStack<T>::isEmpty() {
        if(mTop == 0)
                return true;

    return false;
}

//...
#包括“polstack.h”
//...
模板
bool PolishStack::isEmpty(){
如果(mTop==0)
返回true;
返回false;
}
//...
尝试更改为

template <typename T>
class PolishStack : public AbstractStack<T>
模板
类PolishStack:公共抽象堆栈

作为旁注:异常说明符
throw(Oops)
已被弃用。

如果没有所有代码,很难判断,但我注意到的一点是:

class PolishStack<T> : public AbstractStack<T> {
类PolishStack:公共抽象堆栈{ 应该是:

class PolishStack : public AbstractStack<T> {
类PolishStack:公共抽象堆栈{
这将肯定地修复第一个错误,并可能(但可能不是)修复第二个错误。

正如其他人所说:

template<typename T>
class PolishStack : public AbstractStack<T>
注意:您应该使用
override
关键字,当您尝试使用不同的签名重写函数时(即,您正在引入一个新的函数重载,而不是重写
虚拟
一个)会收到通知

模板
类PolishStack:公共抽象堆栈
{
公众:
...
bool isEmpty()常量覆盖;
...
};

这消除了第一个错误,但第二个错误仍然存在。感谢您的知识,我必须在课堂上对我的教授大声说出来。然后,在您的抽象堆栈中必须有一个纯虚拟成员函数,这在您的PolishStack中是不会被忽略的。请记住,函数原型必须完全匹配(除了多态类的返回类型外),这意味着constness和throw说明符也必须匹配。正如错误消息所述,它似乎是isEmpty()。我假设isEmpty()在AbstractStack中是const。只需将
bool isEmpty()
更改为
bool isEmpty()const
。是的,第二个仍然存在。您的
isEmpty
函数签名中缺少
const
。捕捉得好。我很感激!我不知道override关键字,我一定会记下它。
template<typename T>
bool PolishStack<T>::isEmpty() const
//                             ^^^^^
{
        if(mTop == 0)
                return true;

    return false;
}
template<typename T>
class PolishStack : public AbstractStack<T>
{
public:
    ...

    bool isEmpty() const override;

    ...
};