【问题标题】:Error when using lambdas [duplicate]使用 lambdas 时出错 [重复]
【发布时间】:2013-11-09 00:48:48
【问题描述】:

我有一堂课:

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;
};

当像这样调用 setHotkey 函数时:

setHotkey(sf::Keyboard::Left, [=](){TestActor->move(sf::Vector2f(-20, 0));});
setHotkey(sf::Keyboard::Right, [=](){TestActor->move(sf::Vector2f(20, 0));});

我收到以下错误:

../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 ===|

现在我猜我可以使用 -fpermissive 进行编译,但我想避免这样做。

编辑:

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

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

标题是

template<typename Function>
void setHotkey(sf::Keyboard::Key hotkey, Function onClick);

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

【问题讨论】:

  • 您没有提供足够的代码来重现问题。这是一个使用您的代码的示例,它不会给出错误:coliru.stacked-crooked.com/a/eca4700e759af6a2
  • 我已尝试尽可能多地添加,但无法在实际项目之外重现错误。 ideone.com/LPrUdK是否有可能部分错误是因为inputmap、state、game、statemanager都在一个库中而teststate不在?
  • 请查看编辑。我发现出了什么问题。

标签: c++ templates c++11 lambda


【解决方案1】:

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

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

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

粗略地说,每个翻译单元一个 .cpp 文件(虽然我见过一些奇怪的、恶心的东西......)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2018-05-13
    • 2018-11-28
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多