質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.87%

  • C++

    3122questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

templateクラス継承時のエラーに関して

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 86

nozomin_jp

score 5

 前提・実現したいこと

templateクラスを継承時に、テンプレートパラメータに渡すユーザ定義クラスをヘッダファイル中で前方宣言した場合はコンパイルが
通るのですが、ユーザ定義クラスのヘッダファイルをインクルードした場合はエラーとなりました。
エラーが起きる理由をご教授願います。
エラー発生時のコードは下記に記述致します。

 発生している問題・エラーメッセージ

'Player':定義されていない識別子です。
'State':'Player'は、有効なテンプレート型引数ではありません。

 該当のソースコード

#pragma once

// 継承するテンプレートクラス
#include "State.h"

//#include"Player.h"    // ← Player.hをインクルードするとエラーが出ました。
class Player;           // class Playerを宣言した場合はコンパイルが通りました。

//---------------------------------
// Walk
//---------------------------------
class Walk : public State<Player> {
 public:
     static Walk* instance();

     virtual void enter( Player* p ) override;
     virtual void execute( Player* p ) override;
     virtual void exit( Player* p ) override;
     virtual bool onMessage( Player* p, const Message& msg  );
};

 該当のソースコード(State.h)

#pragma once

class Message;

template<class entityType> class State {
public:

    virtual ~State(){}

    // ステート開始処理
    virtual void enter( entityType* ) = 0;

    // ステート実行処理
    virtual void execute( entityType* ) = 0;

    // ステート終了処理
    virtual void exit( entityType* ) = 0;

    // メッセージ受信時の処理
    virtual bool onMessage( entityType*, const Message& ) = 0;
};

 該当のソースコード(Player.h)

#pragma once

#include "BaseEntity.h"
#include "StateMachine.h"
#include "PlayerOwnedState.h"

class Player : public BaseEntity{
 public:

    Player( int id )
        : mStateMachine( new StateMachine<Player>(this) )
        , BaseEntity( id ) {

        mStateMachine->setState( Walk::instance() );

    }

    // ステートマシーン
    StateMachine<Player>* mStateMachine;

    // ループ処理
    void update() override;

    // メッセージ処理
    virtual bool handleMessage( const Message& msg ) { return true; }

};

 補足情報(FW/ツールのバージョンなど)

Visual Studio 2017

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • HogeAnimalLover

    2018/06/01 21:12

    state.hとplayer.hも確認しないと多分答え出ないですね。

    キャンセル

  • nozomin_jp

    2018/06/01 21:53

    追加いたしました。

    キャンセル

回答 2

checkベストアンサー

0

こんにちは。

#include "Player.h"の代わりにclass Player { };と書き、class Player;を削除しても、エラーは出ませんでした。つまり、Player.h内でPlayerを宣言できていないということです。

ご提示された Player.h でPlayerは宣言できているように見えますので、#includeに失敗している可能性があります。
試しに、Player.h内のclass Playerの行の直前くらいに#errorと書いてコンパイルしてみて下さい。
#errorは必ずコンパイル・エラーとなるプリプロセッサ文ですので、ここでエラーになるはずです。
エラーにならなければ#includeしている Player.h はなにか別のファイルです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

とりあえずStateクラスとPlayerクラスを両方使用しているので、両方ともインクルードしないと運用できないです。(とりあえず宣言だけあればコンパイルは通りますが、多分これでは満足しないでしょう)

Playerをインクルードした時のエラーはどのようなものですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/01 21:56

    下記のようなエラーが出ております。
    ---------
    エラー C2065 'Player': 定義されていない識別子です。
    エラー C2923 'State': 'Player' は、有効な テンプレート 型引数 (パラメーター 'entityType') ではありません。
    エラー C2955 'State': クラス テンプレート を使用するには テンプレート 引数リストが必要です
    エラー C2061 構文エラー: 識別子 'Player'
    エラー C3668 'Walk::enter': オーバーライド指定子 'override' を伴うメソッドは、基底クラス メソッドをオーバーライドしませんでした
    ---------
    プログラムは前方宣言のみで問題なく動いております。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.87%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    JavaFXでキーボード入力がうまくいきません

    <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.effect.*?> <?import javafx.s

  • 解決済

    Stateパターンを作れない

    前提・実現したいこと Stateパターンを勉強しようと実際にコードを書いて 試しに作ってみたのですがいくつもエラーが出てしまいました 発生している問題・エラーメッセージ

  • 解決済

    Unity5のエディタ拡張?について

    bool型の結果によってエディタ上で編集できる変数のリストを変える といったことがしたいです [Unity5のインスペクター] 例) □ isShow これに

  • 解決済

    [Qt]Qtのイベント操作

    (趣味で)C++でやっています。 C++ではGUIはQtが楽らしいので使ってみました。 以前質問したDLL云々は何とか解決しました。 QtCreator付属のヘルプ (

  • 解決済

    [Qt]Qtをクラス化する

    C++でやっています。 Qtを使ってみたいと思い、挑戦中です。 なにやら面倒くさいので Qtを簡略化するDLLを作成しようとしています。 ですが、Qtそのものを使い切れ

  • 解決済

    Mac android 間のデータ通信

    私はandroidstudioでアプリ開発を行なっています。 実現させたいこと ジャイロセンサーで数値を獲得して、その数値をリアルタイムでmacに表示させたい 問題点 ジャ

  • 解決済

    別のソースファイルの関数を別のソースファイルで使えるようにしたい

    別のソースコードに記載されている関数の値を別のソースファイルの関数に使いたいのですが、どうやって書けばいいですか? a.cの中 double GO_MONTE_CARLO::G

  • 解決済

    インスタンスの配列の宣言方法について

    Skebo skebo[40]; 思い通りにプログラムが動かなかったので質問したいのですが。宣言方法はこれであってますか?これでskeboが40個できるんでしょうか?つまらない質

同じタグがついた質問を見る

  • C++

    3122questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。