從李普曼等人C++引物第5版,部分16.1.2:朋友比較和在C++類模板的關係運算符
//forward declarations needed for friend declarations in Blob
template <typename> class BlobPtr;
template <typename> class Blob;
template <typename T> bool operator==(const Blob<T>&, const Blob<T>&)
template <typename T> class Blob {
friend class BlobPtr<T>;
friend bool operator==<T>(const Blob<T>&, const Blob<T>&);
}
第一個問題:在線路
friend bool operator==<T>(const Blob<T>&, const Blob<T>&);
爲什麼在==
之後出現<T>
?爲什麼不簡單地寫
friend bool operator==(const Blob<T>&, const Blob<T>&);
我添加了下面的代碼來定義運算符==和實例化類模板。它成功地編譯和鏈接:
template <typename T>
bool operator==(const Blob<T> &lhs, const Blob<T> &rhs) {return true;}
int main() {
Blob<int> a, b;
a == b;
}
如果我刪除<T>
在friend聲明如下operator==
,我得到一個鏈接錯誤:
Undefined symbols for architecture x86_64: "operator==(Blob<int> const&, Blob<int> const&)", referenced from: _main in partial_blob-3ccda9.o
顯然<T>
以下operator==
是必要的,但爲什麼呢?
第二個問題:如果我想定義比運營商<
關係少爲同一類,我想我應該遵循的==
工作模式:
1)前瞻性聲明的操作
2)申報經營者爲友,在插入附加<T>
其功能我不明白
3)定義了運營商外的類。
因此,我添加以下代碼:
template <typename T> bool operator<(const Blob<T>&, const Blob<T>&);
template <typename T> class Blob {
//other members as before
friend bool operator<<T>(const Blob<T>&, const Blob<T>&);
}
bool operator<(const Blob<T>&, const Blob<T>&) {return true;}
int main() {
//other statements as before
a < b;
}
這將產生圍繞operator<<T>
編譯錯誤,我想是因爲編譯器把<<
作爲插入運算符。但是,如果我重寫朋友宣佈爲
friend bool operator<(const Blob<T>&, const Blob<T>&);
然後我得到==
類似於早期的鏈接錯誤鏈接錯誤:
"operator<(Blob<int> const&, Blob<int> const&)", referenced from: _main in partial_blob-a85d5d.o
我怎樣才能成功地定義操作<
這個類?
(注:因爲更完全實現實現依賴於私有變量的運營商必須聲明爲朋友)
請記住,像這樣聲明的朋友函數不是成員函數,它們是非成員函數,沒有''函數不完整。至於'運營商<'嘗試在運營商名稱和模板(如運營商< )之間添加一個空格。 –
關於未定義的參考及其原因和解決方案(如您所知); http://stackoverflow.com/a/35891188/3747990 – Niall
@JoachimPileborg - 你能提供一個對這個語法介紹的參考嗎?我甚至不知道它叫什麼,所以我很難查找它。它是模板專業化嗎?顯式實例化?對這些術語進行網絡搜索不會產生有用的結果。 – Chad