簡體   English   中英

未在范圍中聲明-Priority_queue C ++的好友比較器類

[英]Not declared in scope - friend comparator class for priority_queue C++

首先讓我壓縮相關代碼,注意產生錯誤的參數movies

// ActorGraph.hpp
class ActorGraph
{
protected:
    class Movie; // definition further below
    friend class MovieYearComparator;

    int func(..., priority_queue<Movie, vector<Movie>, MovieYearComparator> &movies);

    class Movie {...};
};

在實現文件中,我們有:

// ActorGraph.cpp
class MovieYearComparator
{
public:
    bool operator() (const ActorGraph::Movie a, const ActorGraph::Movie b) const
    {
        // comparison operation
    }
};

ActorGraph::func(..., priority_queue<Movie, vector<Movie>, MovieYearComparator> &movies) 
{...}

但是,g ++抱怨在此范圍中未引用MovieYearComparator而是引用了func聲明。 我正確拼寫了所有內容,並且該范例適用於文件中的其他容器,而不是優先級隊列。 請注意, Movie是一個很小的類,因此我選擇按值傳遞它。

當您向前聲明一個類時,您不能使用它做任何事情,您僅有權使用/存儲引用或指向它的指針,例如:

struct A;

struct B {
    A *_a; // Ok
    B (A &a) : _a(&a) { } // Ok
};

void f (A a) { } // Oops!

原因很簡單:如果不使用引用或指針,則編譯器在使用struct / class必須知道其大小。

在您的情況下, priority_queue需要使用Comparer非引用,但是由於第一次實例化模板(在ActorGraph的定義中),您的ComparerMovieYearComparator )不是完整的類型,因此無法實例化priority_queue

您需要定義 MovieYearComparator你的第一個實例之前類priority_queue ,如:

class ActorGraph {
protected:
    class Movie; // definition further below

    class MovieYearComparator
    {
    public:
        // Use reference since your forward-declare Movie
        bool operator() (const ActorGraph::Movie const& a, 
                         const ActorGraph::Movie const& b) const {
            // comparison operation
        }
    };

    int func(..., priority_queue<Movie, vector<Movie>, MovieYearComparator> &movies);

    class Movie {...};
};

如果要使標題保持“干凈”,則只能在標題中定義類,而在cpp文件中實現operator()

class ActorGraph {
protected:
    class Movie; // definition further below

    struct MovieYearComparator {
        bool operator() (const ActorGraph::Movie const& a, 
                         const ActorGraph::Movie const& b) const;
    };

    int func(..., priority_queue<Movie, vector<Movie>, MovieYearComparator> &movies);

    class Movie {...};
};

// .cpp
bool ActorGraph::MovieYearComparator::operator() (const ActorGraph::Movie const& a, 
                                                  const ActorGraph::Movie const& b) const { }

另請注意,由於MovieYearComparator現在是MovieYearComparator的內部類, ActorGraph您無需使其成為朋友類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM