dll 和 template(cegui中遇见的小问题,对解决任何问题没有任何帮助,仅记录)

cegui和ogre中的单件都是通过继承一个模板类Singleton来做的。

ogreSingleton.h为template <typename T> class Singleton;

ceguiSingleton.h是template <typename T> class CEGUIEXPORT Singleton;

 

1.ceguiSingleton.h中去掉CEGUIEXPORT 会导致联机编译IncrediBuild中一片黄色,警告信息为

 warning C4661: 'CEGUI::MouseCursor *CEGUI::Singleton<T>::ms_Singleton' : no suitable definition provided for explicit template instantiation request不知道是嘛意思~知道的大侠帮忙解释一下吧~

 

2.为保持一致~老大让用cegui的singleton,但是好像不能从dll中导出模板是吧?原因是什么?这方面的问题网上也讨论的很多,但是我没找到重点,还是没弄懂。

3.然后自己在头文件里抄了个singleton,忘了当时为什么要加上导出宏了。。。就是CEGUIEXPORT 类似的东西。好像就是“1.”中的问题了~也许在dll内部getSingleton的时候会警告~

4.加上了导出宏(CEGUIEXPORT )后,外部好像又链接不能识别的外部符号了。。。。这个大致知道怎么解决,但是不知道为什么,希望高手解答,过程是cegui的system是单件,但是不能new,构造私有,外部只能通过一个接口create来调用私有的构造函数,而system也覆盖了getSingleton和getSingletonPtr的方法,外部还是没有看到单件,而cegui一些其他的单件没有system这么复杂,比如WindowManager,他的构造函数公有的,也没有重载getSingleton和getSingletonPtr。而这些类似于WindowManager的单件都是在system的构造函数中,system调用自己的一个私有函数createSingletons来new出WindowManager等单件。然后这样就保持了无错。。。甚至是少警告。。。意思就是所有的单件创造都是CEGUI_Base.dll中进行的。。。

问题马马虎虎解决了,但是why?希望高手能帮忙解决下,或者看有无机会以后真正了解。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是基于glfw的实现glfwSetScrollCallback,并在实现调用injectMouseWheelChange通知cegui的代码: ```cpp #include <CEGUI/CEGUI.h> #include <CEGUI/RendererModules/OpenGL/GL3Renderer.h> #include <GLFW/glfw3.h> GLFWwindow* window; CEGUI::OpenGL3Renderer* renderer; CEGUI::GUIContext* context; void scroll_callback(GLFWwindow* window, double xoffset, double yoffset) { CEGUI::Vector2f mousePos = context->getMouseCursor()->getPosition(); CEGUI::MouseWheelEventArgs args; args.window = context->getRootWindow(); args.position = mousePos; args.scroll = static_cast<float>(yoffset); context->injectMouseWheelChange(args); } int main() { // 初始化glfw和CEGUI glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); window = glfwCreateWindow(800, 600, "CEGUI with GLFW", nullptr, nullptr); glfwMakeContextCurrent(window); CEGUI::OpenGL3Renderer& renderer = CEGUI::OpenGL3Renderer::create(); CEGUI::System::create(renderer); // 初始化CEGUI上下文和根窗口 context = &CEGUI::System::getSingleton().getDefaultGUIContext(); CEGUI::WindowManager& winMgr = CEGUI::WindowManager::getSingleton(); CEGUI::Window* rootWindow = winMgr.createWindow("DefaultWindow", "root"); context->setRootWindow(rootWindow); // 注册glfw的滚动回调函数 glfwSetScrollCallback(window, scroll_callback); // 主循环 while (!glfwWindowShouldClose(window)) { glfwPollEvents(); // 更新CEGUI上下文 context->injectTimePulse(1.0f); CEGUI::System::getSingleton().renderAllGUIContexts(); glfwSwapBuffers(window); } // 清理CEGUI和glfw CEGUI::System::destroy(); CEGUI::OpenGL3Renderer::destroy(renderer); glfwTerminate(); return 0; } ``` 在上面的代码,我们使用glfwSetScrollCallback注册了一个滚动回调函数scroll_callback。当滚轮滚动时,该回调函数会被调用。在scroll_callback,我们调用context->injectMouseWheelChange(args)来通知CEGUI滚轮事件的发生。其,args包含了滚轮事件的相关信息,例如滚轮滚动的距离、滚轮事件发生时鼠标的位置等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值