为啥我得到编译错误,“make_managed”不是“Gtk”的成员?
Posted
技术标签:
【中文标题】为啥我得到编译错误,“make_managed”不是“Gtk”的成员?【英文标题】:Why do I get the compile error, "make_managed" is not a member of 'Gtk'?为什么我得到编译错误,“make_managed”不是“Gtk”的成员? 【发布时间】:2018-11-16 09:23:41 【问题描述】:我正在尝试重现该示例 - https://developer.gnome.org/gtkmm-tutorial/stable/sec-treeview-examples.html.en#treeview-dnd-example
编译时错误:
“make_managed”不是文件中“Gtk”的成员 treeview_withpopup.cc 在行 auto item = Gtk::make_managed("_Edit", true);
Netbeans IDE 也在同一行显示错误
“无法解析标识符 make_managed”
我已经从网站上复制了代码,并且 gtkmm.h 包含在头文件中。
我还没有在 *** 上发现任何此类问题! 为什么我会收到此编译错误?
请帮忙。
【问题讨论】:
欢迎来到 Stack Overflow。请阅读the help pages,获取the SO tour,了解how to ask good questions,以及this question checklist。最后学习如何创建Minimal, Complete, and Verifiable Example。 请确保您所包含的 gtkmm.h 属于 gtkmm3,而不是 gtkmm2 您的 gtkmm 版本是什么?尝试pkg-config --modversion gtkmm-3.0
在旧版本的 gtkmm Gtk::make_managed 中不存在。它是最近添加的。
我正在使用 gtkmm3-3.18.1 并使用 pkg-config gtkmm-3.0 --cflags --libs 进行编译
【参考方案1】:
Gtk::make_managed
在gtkmm-3.0/gtkmm/object.h
中定义(参见link)。
我已经遇到了同样的错误。然后我检查了文件object.h
,但没有make_managed
功能。我不知道为什么。我刚刚从 rpm packge 安装(我使用了 OS Fedora 23)。
我的解决方案:
我在/usr/include/gtkmm-3.0/gtkmm/object
中添加make_managed
的code:
template<class T, class... T_Args>
auto make_managed(T_Args&&... args) -> T* // Note: Edited to add return type here!
return manage(new T(std::forward<T_Args>(args)...));
【讨论】:
注意:如果你试图复制过去一些例子,你可能会调用Gtk::make_managed
...为此,你还应该将函数包装在命名空间 Gtk 中。
使用我的 vcpkg 树中包含的 gtkmm 3.22.2-2 进行相同的观察。函数定义已被删除。插入此代码再次将其公开为 Gtk:: 命名空间的成员。【参考方案2】:
@GAVD 提供并由@Ayxan 编辑的答案是正确的。
将由该答案链接的object.h
文件放在包含您的源代码的目录中。
在另一个 #include \<gtkmm-whatevers\>
之前添加一个 #include "object.h"
。make_managed
函数应该可以解析。当 gtkmm 的更新版本永久修复问题时,请确保删除此临时修复。
或者按照您当地的程序更新 /usr/include/gtkmm-3.0/gtkmm/object.h
我发现我还必须添加编译器标志-std=c++14
或-std=gnu++14
,因为make_managed
函数使用自动类型的方式。添加编译器标志会将预期的 C++ 语言级别从默认更改为 2014 标准。
【讨论】:
【参考方案3】:只是编译下页给出的例子:
https://developer.gnome.org/gtkmm-tutorial/stable/sec-range-example.html.en
我已将以下代码片段(感谢@GAVD)添加到 examplewindow.cc 的顶部
namespace Gtk
template<class T, class... T_Args>
auto make_managed(T_Args&&... args) -> T*
return manage(new T(std::forward<T_Args>(args)...));
并且示例已经编译成功(无需修改标准文件)
【讨论】:
以上是关于为啥我得到编译错误,“make_managed”不是“Gtk”的成员?的主要内容,如果未能解决你的问题,请参考以下文章