C++ ';PolishStack&x27;不是类模板,虚拟函数重影错误
我在实现基于抽象父类的类时遇到一些问题。它说PolishStack是一个抽象类,尽管所有虚拟函数都经过编码: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> { ^
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;
...
};