C++ 使用lambdas时出错

C++ 使用lambdas时出错,c++,templates,c++11,lambda,C++,Templates,C++11,Lambda,我有一门课: class InputMap { public: template<typename Function> void setHotkey(sf::Keyboard::Key hotkey, Function onClick) { map[hotkey] = onClick; } void triggerHotkey(sf::Keyboard::Key hotk

我有一门课:

class InputMap
{
    public:
        template<typename Function>
        void setHotkey(sf::Keyboard::Key hotkey, Function onClick)
        {
            map[hotkey] = onClick;
        }

        void triggerHotkey(sf::Keyboard::Key hotkey)
        {
            if(map.find(hotkey) != map.end())
                map[hotkey]();
        }

    protected:
        std::map <sf::Keyboard::Key, std::function<void()>> map;
};
我发现以下错误:

../Tyrant/include/Framework/InputMap.hpp|14|error: ‘void TGE::InputMap::setHotkey(sf::Keyboard::Key, Function) [with Function = TGE::State::setHotkey(sf::Keyboard::Key, Function) [with Function = TestState::enter()::__lambda2]::__lambda1]’, declared using local type ‘TGE::State::setHotkey(sf::Keyboard::Key, Function) [with Function = TestState::enter()::__lambda2]::__lambda1’, is used but never defined [-fpermissive]|
../Tyrant/include/Framework/InputMap.hpp|14|error: ‘void TGE::InputMap::setHotkey(sf::Keyboard::Key, Function) [with Function = TGE::State::setHotkey(sf::Keyboard::Key, Function) [with Function = TestState::enter()::__lambda3]::__lambda1]’, declared using local type ‘TGE::State::setHotkey(sf::Keyboard::Key, Function) [with Function = TestState::enter()::__lambda3]::__lambda1’, is used but never defined [-fpermissive]|
||=== Build finished: 2 errors, 1 warnings ===|
现在我猜我可以使用-fppermission编译,但我希望避免这样做

编辑:

显然,错误是因为InputMap的.cpp文件包含

template<typename Function>
void setHotkey(sf::Keyboard::Key hotkey, Function onClick)
{
    map[hotkey] = onClick;
}
模板
无效设置热键(sf::键盘::键热键,函数onClick)
{
map[hotkey]=onClick;
}
头球是

template<typename Function>
void setHotkey(sf::Keyboard::Key hotkey, Function onClick);
模板
无效设置热键(sf::键盘::键热键,函数onClick);

所以我猜它不喜欢声明和实现在不同的文件中,可能是因为模板?有没有合适的方法来实现这一点,或者我应该只在标题中使用它?

这是因为执行模板实例化的方式

定义必须在其实例化的翻译单元中完全可见

将实现放在.cpp中使定义仅在该翻译单元中可见

粗略地说,每个翻译单元一个.cpp文件(尽管我见过一些奇怪的、病态的东西…)


因此,要解决问题,可以将实现移动到声明它的头中。

您没有提供足够的代码来重现问题。下面是一个使用您的代码的示例,它没有给出错误:我已经尝试添加尽可能多的内容,我无法在实际项目之外重现错误。部分错误是否可能是因为inputmap、state、game、statemanager都在库中,而teststate不在库中?请查看编辑。我发现了问题所在。
template<typename Function>
void setHotkey(sf::Keyboard::Key hotkey, Function onClick);