2

単純な基本クラスとそれを継承する別のクラスを作成しようとしています。次のエラーが表示されます。

guard_room.h:17:1: error: expected class-name before ‘{’ token

私は他の投稿を見てきましたが、どこかに循環依存関係があるようですが、それを解決するために読んだすべてのことを行いました。ここに私のクラスがあります

基本クラス room.h:

#ifndef _room
#define _room

template <typename U, typename T>
class room
{
    public:

        //default constructor
        room();

        //overloaded constructor
        room(U, T);


        //getters/setters
        void set_treasure(T);
        void set_name(U);
        T get_treasure() const;
        U get_name() const;

    private:

        U name;

        //room monster
        //monster room_monster

        T treasure;

};

#include "room.tem"

#endif

継承されたクラスguard_room.h:

#ifndef _guard_room
#define _guard_room

template <typename U, typename T> class room;

template <typename U, typename T>
class guard_room : public room
{
    public:

        //default constructor
        guard_room();

        //overloaded constructor
        guard_room(U, T, T) : room(U, T);

        //battle function?
        void battle();

    private:
        T dummy;

};

#include "guard_room.tem"
#endif

また、継承されたクラスの基本ルーム クラスのインクルードを配置する必要がある場所についても完全に混乱しています。ご協力いただきありがとうございます。

4

2 に答える 2

3

まず、派生クラスは基本クラスの定義全体を表示できる必要があります。派生クラスのファイルの先頭にヘッダーを含める必要があります。(基本クラスは派生クラスを拡張するため、基本クラスは派生クラスの一部です)

また、roomはクラスではなくテンプレートです。具体的なクラスからのみ継承できるため、テンプレート パラメーターを指定する必要があります。すなわち

#include "room.h"

template <typename U, typename T>
class guard_room : public room<U, T>

最後に、.temファイルにはヘッダー ガードも含まれていますか? (そうでない場合は、他のコンパイラエラーを回避するためにそれらも必要になります)


また、イニシャライザ リストはコンストラクタの定義の一部であるため、以下は無効であることに注意してください。

    guard_room(U, T, T) : room(U, T);

コンストラクター定義が他の場所にある場合、ここで必要なのは

    guard_room(U, T, T);

そうでなければ、書くだけで十分かもしれません

    guard_room(U u, T t1, T t2) : room(u, t1) {}
于 2012-04-22T07:07:49.643 に答える
2

ここでコンストラクターの実装の半分を提供しています

//overloaded constructor
guard_room(U, T, T) : room(U, T);

実装をインラインにしたい場合は、コンストラクタ本体も追加する必要があります。

//overloaded constructor
guard_room(U, T, T) : room<U, T>()
{ }

コンストラクターの実装も.temヘッダーの末尾にあるファイルに含まれている場合 (コメントに示されているように)、実際の解決策は、コンストラクター宣言から基本クラスへの参照を削除し、それを別の定義に任せることです。 .

//overloaded constructor
guard_room(U, T, T);
于 2012-04-22T07:06:58.920 に答える