2013-03-11 4 views
3

Я создаю контейнерный класс, который реализует двойной связанный список.Итерационное равенство

template <class T> 
class dl_list { 
public: 
    class link { 
    public: 
     T* data; 
     link *prev, *next; 
    }; 
    class iterator { 
     link* node; 
    public: 
     link* get_node() { return node; } 
     // ++, --, * operators, etc. 
    }; 
    // other stuff 
}; 

Довольно аккуратно, мне весело с ним. Но одна проблема, с которой я столкнулась, - это когда я определяю свои операторы равенства для типа итератора, мне нужно сделать специализированную специализацию.

template <class T> 
bool operator==(typename dl_list<T>::iterator& lhv, typename dl_list<T>::iterator rhv) { 
    return lhv.get_node() == rhv.get_node(); 
} 

не будет работать, я должен специализироваться это так:

bool operator==(typename dl_list<int>::iterator& lhv, typename dl_list<int>::iterator rhv) { 
    return lhv.get_node() == rhv.get_node(); 
} 

для каждого типа я хочу использовать его для, который является раздражающим по очевидным причинам. Как мне обойти это?

ответ

3

Сделать членом iterator класса:

bool operator==(const interator& other) const 
{ 
    return node == other.node; 
} 
+0

это будет работать так же, как перегрузка ':: operator =='? Я не хочу, чтобы я вызывал 'it1.operator == (it2)' явно. – anthropomorphic

+1

Да. Перегруженный поиск оператора включает операторы-члены. – Puppy

+0

Awesome. Я просто попробовал, и это работает неявно. 'it1 == it2' будет вызывать' it1.operator == (it2) 'за кулисами. +1 спасибо. – anthropomorphic

2

Вы не можете. Компилятор не может знать, что некоторые T являются вложенными типами некоторых других U. Рассмотрим

template<> class dl_list<float> { 
public: 
    typedef dl_list<int>::iterator iterator; 
}; 

Вы должны принять тип итератора непосредственно в качестве параметра шаблона, или определить его в качестве члена класса итератора, или определить внешний dl_list класса итератора и просто сделать ЬурейеЕ для него внутри dl_list.

1

Самый простой чистый способ определить оператор внутри класса итератора:

class iterator 
{ 
    public: 
    ... 
    friend bool operator==(iterator& lhs, iterator& rhs) 
    { 
     return lhs.get_node() == rhs.get_node(); 
    } 
}; 

(бит кода запах здесь - я d ожидали get_node(), чтобы иметь версию const, позволяющую operator== принимать параметры по const справка ...)

+0

На самом деле теперь, когда вы указываете на это, я не думаю, что должна существовать неконстантная версия 'get_node()'. Это сделало бы «узел» изменчивым. Я не уверен, что меня это волнует или нет, но это может быть не очень хорошо. – anthropomorphic

+0

Нет, я сумасшедший. Я действительно не должен говорить о программировании в 3 часа ночи. – anthropomorphic

Смежные вопросы