当 运行 gui.get<typename>("") 在 TGUI 中使用 sfml 后端时读取访问冲突
Read Access violation when running gui.get<typename>("") with sfml backend in TGUI
我目前正在尝试使用带有 SFML 作为后端的 TGUI,当我有这段代码时一切正常
#include <iostream>
#include <TGUI/TGUI.hpp>
int main() {
sf::RenderWindow window{ {800, 600}, "TGUI window with SFML" };
tgui::GuiSFML gui{ window };
gui.loadWidgetsFromFile("menus/startMenu.txt");
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
gui.handleEvent(event);
if (event.type == sf::Event::Closed) {
window.close();
}
}
window.clear();
gui.draw();
window.display();
}
}
但是,我随后尝试添加一行来引用从 tgui::Button::Ptr aButton = gui.get<tgui::Button>("a");
加载的按钮。
#include <iostream>
#include <TGUI/TGUI.hpp>
int main() {
sf::RenderWindow window{ {800, 600}, "TGUI window with SFML" };
tgui::GuiSFML gui{ window };
gui.loadWidgetsFromFile("menus/startMenu.txt");
tgui::Button::Ptr aButton = gui.get<tgui::Button>("a"); // right here
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
gui.handleEvent(event);
if (event.type == sf::Event::Closed) {
window.close();
}
}
window.clear();
gui.draw();
window.display();
}
}
它给了我这个错误
Exception thrown at 0x7956271B (tgui.dll) in maze 2.exe: 0xC0000005: Access violation reading location 0x000003E4
我目前正在动态链接 tgui 和 sfml,在 Visual Studio c++ 上使用 TGUI-0.9 和 SFML-2.5.1 以及 Debug x86。
错误还告诉我它来自
template <class T>
typename T::Ptr get(const String& widgetName) const
{
return std::dynamic_pointer_cast<T>(get(widgetName));
}
在 TGUI 中 Container.hpp
。
我认为问题是 dynamic_pointer_cast
引发错误,但我不知道如何解决。我也不明白为什么除了 gui.get<typename>("sometext");
函数之外其他所有东西都有效。有帮助吗?
编辑 1:我已经使用 gui.get()
进行了测试,效果非常好。这意味着问题肯定出在 dynamic_pointer_cast
,因为 gui.get<typename>()
只是调用 gui.get()
并在其上运行 dynamic_pointer_cast
。
好的,所以我只需要重新启动 Visual studio,它现在可以正常工作了
我目前正在尝试使用带有 SFML 作为后端的 TGUI,当我有这段代码时一切正常
#include <iostream>
#include <TGUI/TGUI.hpp>
int main() {
sf::RenderWindow window{ {800, 600}, "TGUI window with SFML" };
tgui::GuiSFML gui{ window };
gui.loadWidgetsFromFile("menus/startMenu.txt");
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
gui.handleEvent(event);
if (event.type == sf::Event::Closed) {
window.close();
}
}
window.clear();
gui.draw();
window.display();
}
}
但是,我随后尝试添加一行来引用从 tgui::Button::Ptr aButton = gui.get<tgui::Button>("a");
加载的按钮。
#include <iostream>
#include <TGUI/TGUI.hpp>
int main() {
sf::RenderWindow window{ {800, 600}, "TGUI window with SFML" };
tgui::GuiSFML gui{ window };
gui.loadWidgetsFromFile("menus/startMenu.txt");
tgui::Button::Ptr aButton = gui.get<tgui::Button>("a"); // right here
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
gui.handleEvent(event);
if (event.type == sf::Event::Closed) {
window.close();
}
}
window.clear();
gui.draw();
window.display();
}
}
它给了我这个错误
Exception thrown at 0x7956271B (tgui.dll) in maze 2.exe: 0xC0000005: Access violation reading location 0x000003E4
我目前正在动态链接 tgui 和 sfml,在 Visual Studio c++ 上使用 TGUI-0.9 和 SFML-2.5.1 以及 Debug x86。
错误还告诉我它来自
template <class T>
typename T::Ptr get(const String& widgetName) const
{
return std::dynamic_pointer_cast<T>(get(widgetName));
}
在 TGUI 中 Container.hpp
。
我认为问题是 dynamic_pointer_cast
引发错误,但我不知道如何解决。我也不明白为什么除了 gui.get<typename>("sometext");
函数之外其他所有东西都有效。有帮助吗?
编辑 1:我已经使用 gui.get()
进行了测试,效果非常好。这意味着问题肯定出在 dynamic_pointer_cast
,因为 gui.get<typename>()
只是调用 gui.get()
并在其上运行 dynamic_pointer_cast
。
好的,所以我只需要重新启动 Visual studio,它现在可以正常工作了