使用 lambda 时出错
Error when using lambdas
我有一个类:
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 ===|
现在我猜我可以用 -permissive 编译,但我想避免这样做。
编辑:
显然,该错误是因为输入映射的.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);
所以我想它不喜欢声明和实现在不同的文件中,可能是因为模板?有没有正确的方法可以做到这一点,还是我应该只在标题中使用它?
这是因为执行模板实例化的方式。
定义必须在实例化的翻译单元中完全可见。
将实现放在.cpp使定义仅在该翻译单元中可见。
粗略地说,每个翻译单元.cpp一个文件(尽管我见过一些奇怪的、病态的、事情......
因此,若要解决问题,可以将实现移动到声明它的标头中。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 访问者访问变体并返回不同类型时出错
- 在Linux for Windows上编译C++代码时出错
- 读取文件的最后一行并输入到链接列表时出错
- 重载操作程序时出错>>用于类中的字符串 memebr
- 调用专用模板时出错"no matching function for call to [...]"
- 可组合的lambda/std::函数与std::可选
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 在Google Kick start中提交时出错
- 在c++中访问int到类对象的映射时出错
- 从 lambda 表达式返回布尔值时出错
- parallel_for lambda 函数填充 2D 向量后出错
- 将 lambda 传递给 STL 集时出错"bad function call"
- 传递非自动常量左值引用时,for_each、map和lambda出错
- 首次尝试使用C lambda表达式时会出错
- 使用 lambda 时出错
- 从 lambda 中调用基本成员函数时出错
- 使用std::for_each lambda函数出错
- 运算符中的 lambda 出错<<具有默认参数的模板类