這裏的目標(代碼簡化,當然):類,它包含了一組本身就帶有自定義比較 - 循環引用
#include <set>
struct Node
{
int Value;
std::set<Node*, CompareNodes> Children;
};
struct CompareNodes
{
bool operator()(const Node* l, const Node* r)
{
return l->Value < r->Value;
}
};
但是,這並不編譯;遇到Node
時遇到類型CompareNodes
。我可以改變順序,但後來我遇到了相反的問題 - Node
在CompareNodes
內部遇到它時將是未知的。前向聲明在兩種情況下都不起作用,因爲每種類型都需要使用另一種類型的方式來定義完整的定義。一個醜陋的解決方法是:
#include <set>
template<typename T>
struct CompareNodes
{
bool operator()(const T* l, const T* r)
{
return l->Value < r->Value;
}
};
struct Node
{
int Value;
std::set<Node*, CompareNodes<Node>> Children;
};
有沒有更好的方法?即使Node
是內部課程,如果答案仍然有效,獎勵分數。
無論如何,您不能製作不完整類型的標準庫容器,至少不能移植。 – juanchopanza
用簡單的英語,你不能有一個包含一組本身的類。 – juanchopanza
@juanchopanza嗯。它可能不是可移植的,但我的編譯器允許它。如果我將其更改爲'std :: set',它仍算作不完整類型嗎? –
dlf