0

我编写了一个使用 C++ stl 的程序set。有一个struct event用来构造集合的,它对应的binary predicate..struct comp来定义它们在集合中的顺序。

代码部分如下所示:

struct event
{
    int s;
    int f;
    int w;
    set<event,comp>::iterator nxt;
};
struct comp
{
    bool operator()(event a, event b)
    {
        if(a.f!=b.f)
            return a.f<b.f;
        else
        {
            if(a.s!=b.s)
                return a.s<b.s;
            else
                return a.w>b.w;
        }
    }
};

set< event , comp > S;

我在这里面临的问题是先写哪个结构?我已经尝试前向声明这两个结构。在这两种情况下我都有编译器错误。

4

2 回答 2

4

您需要在创建std::set对象之前包含这两个定义:

std::set<event,myComp> S;

前向声明对你不起作用,因为一旦你前向声明一个类型,它就会变成一个不完整的类型,在这种情况下,编译器需要知道这两种类型的布局和大小。仅当编译器不需要知道类型的大小或布局时,不完整类型才起作用,例如:指向该类型的指针,因为所有指针都具有相同的大小。

于 2013-01-28T15:09:27.567 回答
2

你可以这样做。注意引用的使用。

struct event;
struct comp
{
    bool operator()(const event& a, const event& b);
}
struct event
{
    int s;
    int f;
    int w;
    set<event,comp>::iterator nxt;
};
bool comp::operator()(const event& a, const event& b)
{
    if(a.f!=b.f)
        return a.f<b.f;
    else
    {
        if(a.s!=b.s)
            return a.s<b.s;
        else
            return a.w>b.w;
    }
}
于 2013-01-28T15:17:35.740 回答