[英]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
的定義中),您的Comparer
( MovieYearComparator
)不是完整的類型,因此無法實例化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.