为啥我得到编译错误,“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_managedgtkmm-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 \&lt;gtkmm-whatevers\&gt; 之前添加一个 #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”的成员?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中的 Pivot 语法错误,为啥我得到不正确的结果?

为啥从命令行编译而不是从 IDE 编译时会出现歧义错误?

当验证失败时我得到(发生异常后不刷新会话)错误消息,为啥?

当我想修改指向常量整数的指针时,为啥我的编译器不显示错误?

在我的 css 中不断遇到资产预编译错误...不知道为啥

为啥 Clojure 编译器不会为不正确的类型提示抛出错误?