【问题标题】:Container of pointers指针容器
【发布时间】:2009-06-16 02:37:36
【问题描述】:

我在声明指向类实例的指针的 STL 集时遇到了一些麻烦。更具体地说,我有这种情况:

class SimulatedDiskFile {
  private:
    // ...
  public:
    // ...
    struct comparator {
      bool operator () (SimulatedDiskFile* const& file_1, SimulatedDiskFile* const& file_2) {
        return ((*file_1)->getFileName() < (*file_2)->getFileName());
      }
    };
}

typedef set<SimulatedDiskFile*, SimulatedDiskFile::comparator> FileSet;

上面的代码不起作用。编译器说它没有找到成员 SimulatedDiskFile::comparator() 函数。如果我将函数与这个声明一起(在结构之外),编译器会说它需要一个类型。

现在我的疑虑在这里(我猜不仅是一个,而且是相关的):

  • 一组指针的正确声明是什么?
  • 比较指针的比较函数的正确声明是什么?

在发帖之前我确实查了很多地方,但我发现这些参考资料令人困惑,并且与我的特殊情况不太相关(尽管我认为它是愚蠢的微不足道 - 实际上,也许这就是原因)。所以,任何好的链接也有很大的帮助!

提前致谢!

【问题讨论】:

  • 为我编译(在 g++ 上),除了你的比较中有错误,因为你既要取消引用指针,又要使用间接。

标签: c++ pointers stl containers


【解决方案1】:

修复一些小故障,

#include <set>

class SimulatedDiskFile {
  public:
    int getFileName() { return 23; }

    struct comparator {
      bool operator () (SimulatedDiskFile* file_1, SimulatedDiskFile* file_2) {
        return (file_1->getFileName() < file_2->getFileName());
      }
    };
};

typedef std::set<SimulatedDiskFile*, SimulatedDiskFile::comparator> FileSet;

编译得很好。

【讨论】:

  • 尝试更改语法以这种方式获取它。仍然没有编译,确切的消息是 'g++ -Wall -g -c modules/sources/model.cpp -o obj/model.o modules/sources/model.cpp:56: error: no 'bool SimulatedDiskFile::comparator (SimulatedDiskFile* const&, SimulatedDiskFile* const&)'在类'SimulatedDiskFile'中声明的成员函数'
  • @Rafael:这个示例对我来说也很好编译。也许您可以发布更完整的代码段,以实际重现特定错误?
  • 是的@Rafael,就像@goldPseudo 说的那样——我给出的这个确切的sn-p 上的确切命令行(复制并粘贴到一个文件中)可以愉快地编译(也有几个g++ 版本)。请复制并粘贴它并尝试确认您没有损坏的 g++;-),然后编辑您的答案以显示最小的完整失败案例!
【解决方案2】:

由于您没有显示 'getFileName()' 方法应该在哪里,所以我只是冒昧地假设您并不是要在比较器中双重取消引用您的指针.即,您应该这样做:

return (file_1->getFileName() < file_2->getFileName());

或:

return ((*file_1).getFileName() < (*file_2).getFileName());

但不是两者兼而有之。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2011-05-16
    • 2014-03-04
    • 1970-01-01
    相关资源
    最近更新 更多