'PolishStack'不是类模板,虚函数鬼错误

时间:2015-11-10 20:50:26

标签: 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> {
      ^          ~~~
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;

这是我的班级标题:

#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

由于其他学生作弊,我不想放弃所有代码,所以我会发布错误抱怨的功能:

#include "polstack.h"

//...

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

    return false;
}

//...

3 个答案:

答案 0 :(得分:3)

正如其他人所说的应该是:

template<typename T>
class PolishStack : public AbstractStack<T>
  

./ abstractstack.h:53:16:注意:未实现的纯虚方法'isEmpty'         'PolishStack'
  virtual bool isEmpty()const = 0;

您错过了const

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

    return false;
}

注意:当您尝试使用不同的签名覆盖函数时,应该使用override关键字(即,您引入了新的函数重载而不是覆盖virtual一个。)

template<typename T>
class PolishStack : public AbstractStack<T>
{
public:
    ...

    bool isEmpty() const override;

    ...
};

答案 1 :(得分:0)

尝试更改为

template <typename T>
class PolishStack : public AbstractStack<T>

作为旁注:不推荐使用异常说明符throw (Oops)

答案 2 :(得分:0)

没有所有代码很难说,但我注意到的一点是:

class PolishStack<T> : public AbstractStack<T> {

应该只是:

class PolishStack : public AbstractStack<T> {

这将确定第一个错误肯定而且可能(但可能不是)第二个。