C++ 在std::multiset(C+;+;)中协调typedef和structs
我不是一个专业的程序员,所以请毫不犹豫地说出显而易见的事实 我的目标是使用名为C++ 在std::multiset(C+;+;)中协调typedef和structs,c++,struct,typedef,multiset,C++,Struct,Typedef,Multiset,我不是一个专业的程序员,所以请毫不犹豫地说出显而易见的事实 我的目标是使用名为currentEvents的std::multiset容器(typedef EventMultiSet)来组织类型为Event的结构列表,并让类Host的成员偶尔向currentEvents添加新的Event结构。结构应该按其成员之一时间进行排序。我不确定我试图做的有多少是合法的;g++编译器报告(在“Host.h”中)“错误:'EventMultiSet'尚未声明。” // Event.h struct Event
currentEvents
的std::multiset
容器(typedef EventMultiSet
)来组织类型为Event
的结构列表,并让类Host
的成员偶尔向currentEvents
添加新的Event
结构。结构应该按其成员之一时间进行排序。我不确定我试图做的有多少是合法的;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 = ¤tEvents;
...
//Event.h
结构事件{
公众:
布尔运算符<(常数事件和rhs)常数{
返回(时间>EventMultiSet;
事件多集当前事件;
EventMultiSet*cePtr=¤tEvents;
...
主要问题
,
编译器错误只是因为typedef位于错误的位置-只有main.cpp知道它。看起来您可能希望它出现在Event.h中,其他两个都包括
我不确定你到底在问什么——但你可能不想直接问
我看不出有什么问题-尽管您可能希望提供其他比较(
,),因为您征求了“显而易见的”陈述我注意到的一件事是,您没有#include
,这是编译器了解multiset
是什么所必需的,或者#include
是了解less
的意思所必需的:
// main.cpp
#include "Event.h"
#include <set>
#include <functional>
...
typedef std::multiset< Event, std::less< Event > > EventMultiSet;
EventMultiSet currentEvents;
EventMultiSet * cePtr = ¤tEvents;
//main.cpp
#包括“Event.h”
#包括
#包括
...
typedef std::multiset>EventMultiSet;
事件多集当前事件;
EventMultiSet*cePtr=¤tEvents;
鉴于您征求了“显而易见”的陈述,我注意到的一件事是您没有#include
,这是您的编译器了解multiset
是什么所必需的,或者#include
是了解less
的意思所必需的:
// main.cpp
#include "Event.h"
#include <set>
#include <functional>
...
typedef std::multiset< Event, std::less< Event > > EventMultiSet;
EventMultiSet currentEvents;
EventMultiSet * cePtr = ¤tEvents;
//main.cpp
#包括“Event.h”
#包括
#包括
...
typedef std::multiset>EventMultiSet;
事件多集当前事件;
EventMultiSet*cePtr=¤tEvents;
谢谢。我在Event.h中将typedef行移到了结构定义下,但在Host.h中未声明EventMultiSet时仍会遇到相同的错误。(Host.h不包含Event.h——只有Host.cpp包含。当我在Host.h中包含Event.h时(我不确定应该这样做),我会收到一条关于重新定义“struct Event”的消息).好的,一个严峻的事实是typedef应该只在一个地方,需要它的所有东西都应该包含该文件。当然,对于struct Event
,情况也是如此。您是否在多个地方(Host.h和Event.h)定义了它。另外,您的所有头文件都有include guard吗?(例如,将Event.h包装在#ifdef Event_h..#endif
)我收到EventMultiSet声明错误,因为我未能将#include添加到Event.h!对此表示抱歉。感谢您建议通过引用传递。我还忘记了Event.h的include卫士。在比较运算符上,请注意,任何具有相同时间的项都可能被洗牌,因为就比较操作而言埃拉托担心,它们是等价的。这可能是个问题,也可能不是,但值得指出。(这取决于排序算法的实现和正在排序的对象的特定内容。在将对象添加到已排序数据结构的情况下,添加与另一个对象具有相同时间戳的对象时,它可能在前面或后面。)所以-如果在具有相同时间戳的事物之间顺序很重要,那么您需要编码更多的信息。好的,抱歉,错误仍然存在:我仍然得到“EventMultiSet”并没有在Host.h中声明,尽管我在Host.cpp中包含了“Event.h”。我被难住了。(DTB:谢谢。现在,在该级别排序是不必要的。)谢谢。我将typedef行移到了Event.h中的struct定义下,但是我仍然得到了关于EventMultiSet未在Host.h中声明的相同错误。(Host.h不包含Event.h--只有Host.cpp包含。当我在Host.h中包含Event.h时,我不确定我是否应该这样做,我会收到一条关于“struct Event”重新定义的消息).好的,一个严峻的事实是typedef应该只在一个地方,需要它的所有东西都应该包含该文件。当然,对于struct Event
,情况也是如此。您是否在多个地方(Host.h和Event.h)定义了它。另外,您的所有头文件都有include guard吗?(例如,在#ifdef Event_h….#endif
中包装Event.h)我收到EventMultiSet声明错误,因为我未能将#include添加到Event.h!对此表示抱歉。谢谢