2017-02-15 16 views
1

Почему я не могу использовать итератор при перегрузке Ostream?Перегрузка потока векторного шаблона с помощью итератора

Если я использую ту же декларацию, используя итеративный подход, она работает.

Рассмотрим следующий код:

template <class T> 
class List { 
    template <class U> 
    friend ostream &operator<<(ostream &os, const List<U> &rhs); 
private: 
    vector<T> v; 
}; 

template<class U> 
ostream & operator<<(ostream & os, const List<U>& rhs) 
{ 
    vector<U>::iterator it = rhs.v.begin(); 
    return os; 
} 

int main() 
{ 
    List<int> list; 
    cout << list << endl; 
    return 0; 
} 
+1

Если C++ 11 доступен для вашей целевой платформы, вам может потребоваться объявить тип итератора как 'auto', поэтому компилятор может вывести правильный тип для вас. В обоих смыслах слова гораздо легче печатать. –

ответ

2
  1. Обратите внимание, что rhs объявлен как ссылка до const, то rhs.v будет const, затем rhs.v.begin() вернет std::vector<U>::const_iterator, который не может быть преобразован непосредственно в std::vector<U>::iterator.

  2. Вы должны использовать typename для dependent type names.

Меняем его

typename vector<U>::const_iterator it = rhs.v.begin(); 

BTW: void main() должен быть int main().

1

Попробуйте с

typename vector<U>::const_iterator it = rhs.v.begin(); 

Если ваш rsh является const, вы должны использовать const_iterator