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 に答える