编译ncurses时出错

问题描述 投票:0回答:2

我正在尝试为嵌入式系统编译 ncurses 5.9(使用 buildroot),但收到此错误消息:

In file included from ../c++/cursesm.h:39:0,
                 from ../c++/cursesm.cc:35:
../c++/cursesp.h: In member function ‘T* NCursesUserPanel<T>::UserData() const’:
../c++/cursesp.h:256:43: error: no matching function for call to 
‘NCursesUserPanel<T>::get_user() const’
     return reinterpret_cast<T*>(get_user ());

这是有问题的代码:

/* We use templates to provide a typesafe mechanism to associate
 * user data with a panel. A NCursesUserPanel<T> is a panel
 * associated with some user data of type T.
 */
template<class T> class NCursesUserPanel : public NCursesPanel
{
public:
  NCursesUserPanel (int nlines,
                    int ncols,
                    int begin_y = 0,
                    int begin_x = 0,
                    const T* p_UserData = STATIC_CAST(T*)(0))
    : NCursesPanel (nlines, ncols, begin_y, begin_x)
  {
      if (p)
        set_user (const_cast<void *>(p_UserData));
  };
  // This creates an user panel of the requested size with associated
  // user data pointed to by p_UserData.

  NCursesUserPanel(const T* p_UserData = STATIC_CAST(T*)(0)) : NCursesPanel()
  {
    if (p)
      set_user(const_cast<void *>(p_UserData));
  };
  // This creates an user panel associated with the ::stdscr and user data
  // pointed to by p_UserData.

  virtual ~NCursesUserPanel() {};

  T* UserData (void) const
  {
    return reinterpret_cast<T*>(get_user ());
  };
  // Retrieve the user data associated with the panel.

  virtual void setUserData (const T* p_UserData)
  {
    if (p)
      set_user (const_cast<void *>(p_UserData));
  }
  // Associate the user panel with the user data pointed to by p_UserData.
};

第 256 行是这个:

return reinterpret_cast<T*>(get_user ());

embedded-linux ncurses
2个回答
5
投票

这里的问题是由于编译器更新为

g++ (Debian 7.2.0-5)
。新的编译器具有更好的错误处理能力,而这些旧代码的编写并没有带来任何好处。这里的解决方案是使用更新版本的 ncurses(不适用于我的特定情况)或使用较旧的编译器。由于我的主机系统是 Debian,我使用 update-alternatives 切换到 g++ 6.4,有问题的错误消息消失了。

我将其留在这里,因为 Google 没有为我提供错误消息的良好结果。


0
投票

问题来自于方法的

const
限定符不匹配。方法
get_user()
标记为非
const
,而方法
UserData()
标记为
const
。这意味着它尝试调用一个允许在不允许的上下文中更改对象的方法。它试图通过搜索方法
const
get_user()
变体来解决这个问题,但未能找到。这基本上就是错误消息告诉我们的内容。
要解决此问题,请从以下位置调用
const
的所有
UserData()
方法中删除
get_user()
限定符:

  • cursesf.h
    706线
  • cursesm.h
    662 号线
  • cursesp.h
    第254行

这对我的 GCC 14.2 有用。

© www.soinside.com 2019 - 2024. All rights reserved.