c++ - 将 SFML 的 RenderWindow 对象传递给模板函数
问题描述
我是新手 C++ 程序员,我不是专业人士。我对 C++ 中的模板感到很困惑。
我正在使用 SFML,我可以创建一个窗口并处理它。在下一步中,我决定编写一个模板函数来处理生成的关闭信号。但我的代码无法编译。问题出在哪里?
#include <SFML/Graphics.hpp>
#include <iostream>
template <typename T>
void EventHandler(T& window) {
std::cout << "Close event is made." << std::endl;
window.close();
std::cout << "Window is closed succesfully." << std::endl;
break;
}
int main()
{
sf::RenderWindow window(sf::VideoMode(512, 512), "SMFL Tutorial", sf::Style::Default);
sf::Event events;
while (window.isOpen())
{
while (window.pollEvent(events))
{
switch (events.type)
{
case events.Closed:
EventHandler(window);
default:
std::cout << "Unkown Events are creating." << std::endl;
break;
}
}
}
return 0;
}
解决方案
您需要将 break 语句从您的函数移动到 switch 中的 case 并正确使用sf::Event::EventType
enum :
#include <SFML/Graphics.hpp>
#include <iostream>
template <typename T>
void EventHandler(T& window) {
std::cout << "Close event is made." << std::endl;
window.close();
std::cout << "Window is closed succesfully." << std::endl;
/// break; <- From here
}
int main()
{
sf::RenderWindow window(sf::VideoMode(512, 512), "SMFL Tutorial", sf::Style::Default);
sf::Event events;
while (window.isOpen())
{
while (window.pollEvent(events))
{
switch (events.type)
{
case sf::Event::Closed:
EventHandler(window);
break; /// <- To here
default:
std::cout << "Unkown Events are creating." << std::endl;
break;
}
}
}
return 0;
}
此外,为什么需要模板函数?您的EventHandler
函数可以引用 asf::window
以使用sf::Window
and sf::RenderWindow
:
void EventHandler(sf::Window& window) {
std::cout << "Close event is made." << std::endl;
window.close();
std::cout << "Window is closed succesfully." << std::endl;
}
推荐阅读
- javascript - Mongoose 和 Next.js:未处理的运行时错误 TypeError:无法读取未定义的属性(读取“令牌”)
- swift - AVFoundation 音频播放器仅在播放器停止时从滑块更新音量。我希望在拖动滑块时音量实时更新
- scipy - 如何使用 scipy.optimize.curve_fit 成功地将数据拟合到莫尔斯势?
- python - 如何在 Python 中使用 Selenium 设置动态显式等待?
- c# - 您可以从基本 Win32 控制台模板应用程序(不是 WinForm/abstractions/wrappers 或使用 C++/Winrt 模板)内的 C#/Winrt 组件调用吗?)
- accessibility - 如何向 pa11y ax runner 添加自定义规则?
- asp.net-mvc - 如何在 .Net 框架中长时间读取和写入 Azure 中的控制台?
- java - UDP 数据报已发送但从未收到
- glib - 如何使用 Vala 建立 TLS 连接?
- node.js - 运行 Docker 容器时无法显示我的 React UI