好吧,我认为我已经找到了模板类的实现文件,但显然不是......我在VS 2013 C ++解决方案中有以下文件:
Main.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':不是'`global namespace''state.inl 6 1
的成员错误1错误C2143:语法错误:缺少';'在'&lt;'之前state.inl 2 1
错误2错误C2988:无法识别的模板声明/定义state.inl 2 1
错误3错误C2059:语法错误:'&lt;' state.inl 2 1
错误4错误C3083:'上下文':'::'左侧的符号必须是state.inl 2 1
的类型错误5错误C2039:'上下文':不是'`全局命名空间''state.inl 2 1
的成员
非常感谢有关如何解决这些错误的任何帮助!
答案 0 :(得分:0)
一个疯狂的猜测是,您将.inl
文件作为独立的翻译单元添加到项目中,编译器尝试将它们编译为独立的翻译单元。
这些文件作为独立的翻译单元没有任何意义,它们也不会这样编译。这些是包含文件(也称为头文件)。它们应该被项目视为头文件。它们不应该直接编译。