2017-02-15 79 views
1

爲什麼我不能在ostream重載中使用迭代器?重載迭代器的矢量模板的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. 您應該使用typenamedependent 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(); 

如果您rshconst,你應該使用const_iterator