0

さて、私はテンプレート クラスの実装ファイルを把握していると思っていましたが、どうやらそうではないようです... VS 2013 C++ ソリューションには次のファイルがあります。

メイン.cpp

#include "StateManager.h"
#include "State.h"

enum class Derp {
    Herp,
    Lerp,
    Sherp,
};

int main() {
    Game2D::State<Derp>::Context context(5);
    Game2D::StateManager<Derp> mgr(context);

    return 0;
}

StateManager.h

#pragma once

#include "State.h"

namespace Game2D {

    template<typename Id>
    class StateManager {
    private:
        typename State<Id>::Context _context;

    public:
        explicit StateManager(typename State<Id>::Context context);
    };

#include "StateManager.inl"

}

StateManager.inl

template<typename Id>
StateManager<Id>::StateManager(typename State<Id>::Context context) :
    _context(context)
{ }

State.h

#pragma once

namespace Game2D {

    template<typename Id>
    class StateManager;

    template<typename Id>
    class State {
    public:
        struct Context {
            Context(int);
            int data;
        };

    private:
        StateManager<Id>* _manager;
        Context _context;

    public:
        State(StateManager<Id>&, Context);
        virtual ~State();

    };

#include "State.inl"

}

State.inl

template<typename Id>
State<Id>::Context::Context(int data) {
    this->data = data;
}

template<typename Id>
State<Id>::State(StateManager<Id>& manager, Context context) :
    _manager(&manager),
    _context(context)
{ }
template<typename Id>
State<Id>::~State() { }

このプロジェクトをビルドすると、次のエラーが発生します。

エラー 10 エラー C1903: 以前のエラーから回復できません。コンパイルを停止します state.inl 9 1

エラー 9 エラー C2065: 'context': 宣言されていない識別子 state.inl 8 1

エラー 7 エラー C2065: 'manager': 宣言されていない識別子 state.inl 7 1

エラー 8 エラー C4430: 型指定子がありません - int と見なされます。注: C++ は default-int state.inl 7 1 をサポートしていません

エラー 6 エラー C2039: '状態': '`グローバル名前空間'' のメンバーではありません state.inl 6 1

エラー 1 エラー C2143: 構文エラー: ';' がありません 前 '<' state.inl 2 1

エラー 2 エラー C2988: 認識できないテンプレートの宣言/定義 state.inl 2 1

エラー 3 エラー C2059: 構文エラー: '<' state.inl 2 1

エラー 4 エラー C3083: 'Context': '::' の左側のシンボルは、state.inl 2 1 型でなければなりません

エラー 5 エラー C2039: 'Context' : '`global namespace'' のメンバーではありません state.inl 2 1

これらのエラーを修正する方法についてのヘルプは大歓迎です!

4

1 に答える 1

0

.inlファイルをスタンドアロンの翻訳単位としてプロジェクトに追加し、コンパイラがそれらをスタンドアロンの翻訳単位としてコンパイルしようとしたというのは、大雑把な推測です。

これらのファイルは、スタンドアロンの翻訳単位としては意味がなく、そのままではコンパイルされません。これらはインクルード ファイル (別名ヘッダー ファイル) です。これらは、プロジェクトによってヘッダー ファイルとして認識されるはずです。直接コンパイルすることは想定されていません。

于 2015-08-11T22:32:37.373 に答える