1

我无法弄清楚我在这里做错了什么。
我想对列表进行排序并具有比较功能来对其进行排序。
找到了一个代码示例,正是我的问题得到了解决,但它对我不起作用。

我总是收到此错误:
错误:ISO C++ 禁止声明没有类型的“单元”

细胞不是我的类型吗?

AStarPlanner.h

class AStarPlanner {

public:

  AStarPlanner();

  virtual ~AStarPlanner();

protected:

  bool compare(const Cell& first, const Cell& second);

  struct Cell {

        int x_;
        int y_;
        int f_;   // f = g + h
        int g_;   // g = cost so far
        int h_;   // h = predicted extra cost

        Cell(int x, int y, int g, int h) : x_(x), y_(y), g_(g), h_(h) {
                f_ = g_ + h_;
        }
  };

};

AStarPlanner.cpp

 bool AStarPlanner::compare(const Cell& first, const Cell& second)
 {
    if (first.f_ < second.f_)
       return true;
    else
       return false;
 }
4

2 回答 2

7

将声明移到Cell方法声明之前。

class AStarPlanner {
public:
  AStarPlanner();
  virtual ~AStarPlanner();
protected:
  struct Cell {
        int x_;
        int y_;
        int f_;   // f = g + h
        int g_;   // g = cost so far
        int h_;   // h = predicted extra cost
        Cell(int x, int y, int g, int h) : x_(x), y_(y), g_(g), h_(h) {
                f_ = g_ + h_;
        }
  };
  bool compare(const Cell& first, const Cell& second);
};

此外,从技术上讲,没有Cell类型,但是AStarPlanner::Cell(但它会在 的上下文中自动解析class)。

于 2012-05-21T07:47:31.847 回答
4

关于类声明中名称可见性的 C++ 规则并不明显。例如,即使该成员稍后在类中声明,您也可以拥有引用成员的方法实现......但是如果稍后声明类型,则不能拥有引用嵌套类型的方法声明。

在类的开头移动嵌套类型声明可以解决您的问题。

这种限制没有技术原因(或者说得更好,我看不出它可能是什么,但我从来不敢编写完整的 C++ 解析器)。然而,这就是语言的定义方式。

于 2012-05-21T08:02:49.363 回答