2012-12-16 104 views
2

可能重複:
no matching function error using template template parameters in a function錯誤編譯「敵不過==操作符」

好mornig我不明白,因爲我獲得通過實施全球功能操作編譯錯誤==(在類myList :: iterator) 如果我認識到operator ==作爲成員函數的代碼編譯。

的誤差

error: no match for operator== in it == it1 
note: candidate is: 
note: tempalte<class T> bool operator==(const typename myList<T>::iterator&,const typename myList<T>::iterator&) 

的代碼是:

#include <iostream> 
#include <cstdlib> 
#include <iterator> 
#include <typeinfo> 

template <class T> 
class myList; 

template <class T> 
bool operator==(const typename myList<T>::iterator& lhs,const typename myList<T>::iterator& rhs); 
template <class T> 
bool operator!=(const typename myList<T>::iterator& lhs,const typename myList<T>::iterator& rhs); 

template <class T> 
class myList 
{ 
private: 
    class myInfo; 
public: 
    //CTR DEFAULT 
    myList():_pInfo(NULL) 
    {} 
    myList(T value):_pInfo(new myInfo(value)) 
    {} 
    // class iterator; 
    // friend class iterator; 
    class iterator{ 
    public: 
    //creo gli iteratori 
    iterator():_pMyInfoIt(NULL) 
    {} 
    iterator(myInfo* p):_pMyInfoIt(p) 
    {} 
    iterator(const iterator& it):_pMyInfoIt(it._pMyInfoIt) 
    {} 
    iterator& operator=(const iterator& it) 
    { 
     _pMyInfoIt = it._pMyInfoIt; 
     return *this; 
    } 
    //creo funzioni che lavorano sugli iteratori 
    /* 
    bool operator==(const iterator& rhs) 
    { 
     return _pMyInfoIt == rhs._pMyInfoIt; 

    } 
    */ 
    friend bool operator== <T>(const typename myList::iterator& lhs,const typename myList::iterator& rhs); 
    friend bool operator!= <T>(const typename myList<T>::iterator& lhs,const typename myList<T>::iterator& rhs); 
    private: 
    myInfo* _pMyInfoIt; 
    }; 

    myList::iterator begin() 
    { 
    std::cout << __PRETTY_FUNCTION__ << std::endl; 
    return iterator(_pInfo); 
    } 

private: 
    class myInfo 
    { 
    public: 
    myInfo(const T& data):_data(data),_pMyInfo(NULL) 
    {} 
    private: 
    T _data; 
    myInfo* _pMyInfo; 
    }; 
    myInfo* _pInfo; 
}; 


template <class T> 
bool operator==(const typename myList<T>::iterator& lhs,const typename myList<T>::iterator& rhs) 
{ 
    std::cout << __PRETTY_FUNCTION__ << std::endl; 
    return lhs._pMyInfoIt == rhs._pMyInfoIt; 
} 

template <class T> 
bool operator!=(const typename myList<T>::iterator& lhs,const typename myList<T>::iterator& rhs) 
{ 
    return !(lhs == rhs); 
} 

int main(int argc,char** argv){ 
    myList<int> test; 
    myList<int>::iterator it = test.begin(); 
    myList<int>::iterator it1 = test.begin(); 
    std::cout << typeid(it1).name() << std::endl; 
    if(it == it1) 
    std::cout << "EQUAL" << std::endl; 
    return EXIT_SUCCESS; 
} 

在此先感謝

+0

另外,您可能要考慮在1參數構造函數中使用explicit關鍵字。 – user673679

回答

0

編譯器不能推斷T.更改爲:

template <class IT, class=typename IT::iterator_category> 
bool operator==(const IT& lhs, const IT& rhs) 

第二模板參數d簡單的SFINAE,所以只有迭代器會匹配。

0

定義友元函數的類體中:

friend bool operator== <>(const typename myList<T>::iterator& lhs, const typename myList<T>::iterator& rhs) 
{ 
    std::cout << __LINE__ << std::endl; 
    return lhs._pMyInfoIt == rhs._pMyInfoIt; 
} 
friend bool operator!= <>(const typename myList<T>::iterator& lhs, const typename myList<T>::iterator& rhs) 
{ 
    return !(lhs == rhs); 
} 

它應該工作。

+0

這不就是'friend bool operator ==(const iterator&lhs ...'如果你這樣做的話? – user673679

+0

這些是模板函數,所以它們應該看起來像 friend bool operator!= <>( const typename myList :: iterator&lhs,const typename myList :: iterator&rhs) – pimanych

+0

據我所知,它們不是。它們是正常的非模板函數,由於實例化過程注入全局範圍每個myList獲取一個 :: iterator)(查找Barton-Nackman技巧)。 – user673679

0

由於pimanych說,聲明類體內的友元函數體:

friend bool operator==(const iterator& lhs, const iterator& rhs) 
    { 
     return lhs._pMyInfoIt == rhs._pMyInfoIt; 
    } 
    friend bool operator!=(const iterator& lhs, const iterator& rhs) 
    { 
     return !(lhs == rhs); 
    } 

注意,這些並不是真正的模板功能,但是當myList<T>(和myList<T>::iterator)被實例化只是聲明。您可以通過嘗試比較myList<int>::iteratormyList<float>::iterator進行檢查 - 您應該會收到編譯器錯誤。

查看Barton-Nackman技巧了解更多詳情。