さて、私はテンプレート クラスの実装ファイルを把握していると思っていましたが、どうやらそうではないようです... 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
これらのエラーを修正する方法についてのヘルプは大歓迎です!