簡體   English   中英

使用帶有模板迭代器的免費函數來重載operator ==

[英]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_TMapped_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_TMapped_T

暫無
暫無

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

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