C++ 在 标记之前期望类名,继承错误

Posted

技术标签:

【中文标题】C++ 在 标记之前期望类名,继承错误【英文标题】:C++ expected class-name before token, an inheritance errorC++ 在 标记之前期望类名,继承错误 【发布时间】:2017-12-05 12:36:38 【问题描述】:

KSetBase.h 基类,一个接口

#ifndef HW6_GTUSETBASE_H
#define HW6_GTUSETBASE_H

class KSet;

#include <cstddef>
namespace TU 
    template<typename T>
    class KSetBase 
    public:
        virtual bool empty() const = 0;

        virtual size_t size() const = 0; //int is not okay since unsigned also could be in.
        //comparisons would be not working if that was case
        //detailed
        //https://***.com/questions/1181079/stringsize-type-instead-of-int

        virtual size_t max_size() const = 0;

        virtual void insert(T first, T second) = 0; //cift dondurmesi gerekli
        virtual void erase(T deleter) = 0;

        virtual void clear() = 0;

        virtual T find(T deneme) = 0;

        virtual size_t count(T testle) = 0;

        virtual T begin() = 0;

        virtual T end() = 0;

    protected:
        ~GTUSetBase() 
            //do nothing
        

    ;


#endif //HW6_GTUSETBASE_H

KSet.h(派生类)

#include "KSetBase.h"
#ifndef HW6_GTUSET_H
#define HW6_GTUSET_H


#include <memory>

using namespace std;
namespace TU 

    template<typename T>
    class KSet : public KSetBase 
    public:
        bool empty() const;

        size_t size() const;

        size_t max_size() const;

        void insert(T first);

        void erase(T deleter);

        void clear();

        T find(T deneme);

        size_t count(T testle);

        T begin();

        T end();

    protected:
        int hmany = 0;
        shared_ptr<T> set_harmony;


    ;



#endif //HW6_GTUSET_H

我无法弄清楚我的代码的哪一部分是错误的。我基本上从接口类中做了一个基本的继承,我在 KSet.cpp 中实现了所有功能。理论上看起来没什么问题,但它给出了 2 个错误。

在 main.cpp 和 KSet.cpp 中

class KSet : public KSetBase 错误线是这样的。

我检查了#ifndef 和#defines,我考虑过使用前向声明,但我似乎无法解决这个问题。我真的被这个问题困住了。我搜索了整个网络,最后总是在语法或可见的东西上出现大错误,但我无法弄清楚我的。这是非常简短的代码。

【问题讨论】:

KSetBase是一个类template,模板不能被继承。您只能从具体类(或struct)继承。 KSetBase&lt;T&gt;一个具体的类。 您是说: public KSetBase&lt;T&gt; 吗? 在不相关的注释中,即使 KSetBase 析构函数没有做任何事情,您仍然应该使用 virtual 我不应该使用默认析构函数吗? 可能(关于default 构造函数),但仍应标记为virtual 【参考方案1】:

KSetBase 是一个模板类,如果你从它继承你必须指定一个模板参数:

template<typename T>
    class KSet : public KSetBase<T>

此外,您似乎在基类析构函数中有错字。

【讨论】:

哇,这是我犯的错误,非常感谢你。有趣的是,即使像 C-Lion 这样的逻辑 IDE 似乎也无法找出这个错误。

以上是关于C++ 在 标记之前期望类名,继承错误的主要内容,如果未能解决你的问题,请参考以下文章

C++:错误:“”标记之前的预期类名

'令牌类继承之前的c ++预期类名[重复]

“”之前的预期类名

C++ 构造函数错误 - 标记 '<' 之前应为 ')'

C++ 错误:'(' 标记之前的预期构造函数、析构函数或类型转换

c++ 错误:预期构造函数、析构函数或在“(”标记之前的类型转换