[英]Overloading operator== With a Free Function That Takes Templated Iterators
因此,我試圖創建一個比較兩個迭代器的函數,但不確定如何正確使用模板。 班級
template<typename Key_T, typename Mapped_T>
class Map{...}
免費功能
bool operator==(const Map::Iterator &iter1, const Map::Iterator &iter2) {
return (*(iter1.ref->key) == *(iter2.ref->key)) ? true : false; }
我得到這個錯誤
error: invalid use of template-name ‘cs540::Map’ without an argument list
然后我嘗試了這個
template<typename Key_T, typename Mapped_T>
bool operator==(const Map<Key_T,Mapped_T>::Iterator &iter1, const Map<Key_T,Mapped_T>::Iterator &iter2) {...}
我得到這個錯誤
error: need ‘typename’ before ‘cs540::Map<Key_T,
Mapped_T>::Iterator’ because ‘cs540::Map<Key_T, Mapped_T>’ is a dependent scope
錯誤消息告訴您,您需要通過在編譯器前面寫入typename
來告訴編譯器Map<Key_T,Mapped_T>::Iterator
是一種類型。
template<typename Key_T, typename Mapped_T>
bool operator==(const typename Map<Key_T,Mapped_T>::Iterator &iter1,
const typename Map<Key_T,Mapped_T>::Iterator &iter2) { ...}
請參閱在何處以及為什么必須在其中放置“模板”和“類型名”關鍵字? 解釋為什么需要這樣做。
但這對您也不起作用。 ::
左側的所有內容都是非推論上下文 ; 為了使操作員功能模板可用,編譯器必須能夠從調用中推斷出模板參數,但是當模板參數僅出現在非推導上下文中時,編譯器就不能這樣做。 結果是永遠無法推導出Key_T
和Mapped_T
,並且永遠不會使用operator==
。
您的設計似乎與
template<typename Key_T, typename Mapped_T>
class Map{
class Iterator {
// ...
};
// ...
};
通常的方法是在Iterator
定義中定義一個非模板的friend
operator==
,即
template<typename Key_T, typename Mapped_T>
class Map{
class Iterator {
// ...
friend bool operator==(Iterator iter1, Iterator iter2) {
return /* ... */;
}
};
// ...
};
一種可能的替代方法是在Map
之外使Iterator
成為自己的類模板:
template<typename Key_T, typename Mapped_T>
class MapIterator {
// ...
};
template<typename Key_T, typename Mapped_T>
class Map{
using Iterator = MapIterator<Key_T, Mapped_T>;
};
現在你可以寫
template<typename Key_T, typename Mapped_T>
bool operator==(MapIterator<Key_T, Mapped_T> iter1, MapIterator<Key_T, Mapped_T> iter2) {
return /* ... */;
}
因為現在可以正確推斷Key_T
和Mapped_T
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.