C ++使用模板定义结构

时间:2014-09-21 22:59:11

标签: c++ templates struct

我不明白为什么我无法定义这个结构:

//Class.h

template <class T>
struct Callback {
    T* Object;
    std::function<void()> Function;
};

template <class T>
struct KeyCodeStruct {
    typedef std::unordered_map<SDL_Keycode, Callback<T>> KeyCode;
};

template <class T>
struct BindingStruct{
    typedef std::unordered_map<int, KeyCodeStruct<T>> Binding;
};


class Class {
public:
    template <class T>
    void bindInput(SDL_EventType eventType, SDL_Keycode key, Callback<T> f);
private:
    template <class T>
    BindingStruct<T> inputBindings; //How do I define this? This gives me an error.
}

它给出了错误: Member 'inputBindings' declared as a template. 我不太了解模板,所以我可能只是错过了我需要的信息。

更新(回应deviantfan)

现在我的cpp类遇到了我所拥有的函数的问题。

template <class T>
void InputManager::bindInput(SDL_EventType eventType, SDL_Keycode key, Callback<T> f)
{
    inputBindings[eventType][key] = f;
}

它表示期望的类或命名空间。

2 个答案:

答案 0 :(得分:6)

错:

class Class {
private:
    template <class T>
    BindingStruct<T> inputBindings;
}

右:

template <class T>
class Class {
private:
    BindingStruct<T> inputBindings;
}

答案 1 :(得分:4)

回应您的更新

如果您将类定义为类模板,请执行以下操作:

template <class T>
class InputManager
{
    ...
};

然后在您的定义中,您需要显示InputManager是一个类型为T的实例化:

template <class T>
void InputManager<T>::bindInput(SDL_EventType eventType, SDL_Keycode key, Callback<T> f)
{
    inputBindings[eventType][key] = f;
}

ie:注意InputManager<T>而不仅仅是InputManager