模板INL文件非常困惑

时间:2015-08-11 18:51:00

标签: c++ header-files class-template

好吧,我认为我已经找到了模板类的实现文件,但显然不是......我在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

的成员

非常感谢有关如何解决这些错误的任何帮助!

1 个答案:

答案 0 :(得分:0)

一个疯狂的猜测是,您将.inl文件作为独立的翻译单元添加到项目中,编译器尝试将它们编译为独立的翻译单元。

这些文件作为独立的翻译单元没有任何意义,它们也不会这样编译。这些是包含文件(也称为头文件)。它们应该被项目视为头文件。它们不应该直接编译。