【问题标题】:Coordinating typedefs and structs in std::multiset (C++)在 std::multiset (C++) 中协调 typedef 和结构
【发布时间】:2010-04-12 18:35:45
【问题描述】:

我不是专业的程序员,所以请不要犹豫,说清楚。

我的目标是使用名为currentEventsstd::multiset 容器(typedef EventMultiSet)来组织结构列表,类型为Event,并让Host 类的成员偶尔添加新的Event结构为currentEvents。这些结构应该按其成员之一时间排序。我不确定我想做的有多少是合法的。 g++ 编译器报告(在“Host.h”中)“错误:'EventMultiSet' 尚未声明。”这就是我正在做的事情:

// Event.h
struct Event {
  public:

  bool operator < ( const Event & rhs ) const {
  return ( time < rhs.time );
 }

 double time;
 int eventID;
 int hostID;
};

// Host.h
...
void calcLifeHist( double, EventMultiSet * ); // produces compiler error
...
void addEvent( double, int, int, EventMultiSet * ); // produces compiler error

// Host.cpp
#include "Event.h"
...

// main.cpp
#include "Event.h"
...
typedef std::multiset< Event, std::less< Event > > EventMultiSet;
EventMultiSet currentEvents;
EventMultiSet * cePtr = &currentEvents;
...

主要问题

  1. 我应该在哪里包含 EventMultiSet typedef?
  2. 我的 EventMultiSet 指针明显有问题吗?
  3. 我的 Event 结构中的比较函数(理论上)可以吗?

非常感谢您。

【问题讨论】:

    标签: c++ struct typedef multiset


    【解决方案1】:
    1. 编译器错误仅仅是因为你的 typedef 放错了地方——只有 main.cpp 知道。看起来您可能想要在 Event.h 中使用它,其他两个都包含它。

    2. 我不确定你到底在问什么 - 但可能你想pass by reference 而不是指针?

    3. 我看不出有什么问题 - 尽管您可能还想提供其他比较(&gt;&lt;=、...)。

    【讨论】:

    • 谢谢。我将 typedef 行移到 Event.h 中的结构定义下,但我仍然收到关于未在 Host.h 中声明 EventMultiSet 的相同错误。 (Host.h 没有#include Event.h——只有 Host.cpp 有。当我在 Host.h 中包含 Event.h 时,我不确定我应该这样做,我收到一条关于重新定义“结构事件”)。
    • 好吧,一个硬道理是 typedef 应该只在一个地方,所有需要它的东西都应该包括那个文件。当然,struct Event 也是如此。您是否在多个地方定义了它(Host.h 和 Event.h?)此外,您的所有头文件是否都包含保护? en.wikipedia.org/wiki/Include_guard(例如,将 Event.h 包装在 #ifdef EVENT_H .... #endif 中)
    • 我收到 EventMultiSet 声明错误,因为我未能将 #include 添加到 Event.h!对于那个很抱歉。感谢您通过引用传递的建议。我还忘记了 Event.h 的包含保护。
    • 在比较运算符上,请注意任何具有相同时间的项目可能会被打乱,因为就比较运算符而言,它们是等价的。这可能是也可能不是问题,但需要指出。 (这取决于排序算法的实现以及您正在排序的事物的特定内容。在将事物添加到排序数据结构的情况下,添加与另一个事物具有相同时间戳的事物,它可能会在之前或之后.) 因此,如果具有相同时间戳的事物之间的顺序很重要,则需要对更多信息进行编码。
    • 好的,抱歉,错误仍然存​​在:尽管我在 Host.cpp 中有#include "Event.h",但我仍然在 Host.h 中未声明“EventMultiSet”。我难住了。 (DTB:谢谢。目前,不需要在该级别进行排序。)
    【解决方案2】:

    鉴于您征求了“显而易见的”声明,我注意到的一件事是您没有 #include &lt;set&gt;,这是为了让您的编译器知道 multiset#include &lt;functional&gt; 是什么所必需的需要知道less 的含义:

    // main.cpp
    #include "Event.h"
    #include <set>
    #include <functional>
    ...
    typedef std::multiset< Event, std::less< Event > > EventMultiSet;
    EventMultiSet currentEvents;
    EventMultiSet * cePtr = &currentEvents;
    

    【讨论】:

    • Doh。不知道#include 。谢谢。
    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多