2016-06-10 91 views
1

我想使用C++ 11「for循環」迭代矢量的元素,但我收到一些錯誤(begin()和end()函數,我認爲是一個問題)。謝謝!STL vector:迭代元素

#include <iostream> 
#include <vector> 
#include<iterator> 
using namespace std; 
template<typename TElement> 
class MyClass { 
private: 
    vector<TElement> vec; 
public: 

MyClass& operator+(TElement n) { 
    vec.push_back(n); 
    return *this; 
} 
int getS() { 
    return vec.size(); 
} 
iterator begin() {//here is some problems 
    return vec.begin(); 
} 
iterator end() { 
    return vec.end(); 
} 
}; 

int main() { 
    MyClass<int> mm; 
    mm = mm + 10; 
    mm = mm + 9; 
    double avg = 0.0; 
    for (auto g : mm) { //begin() and end() functions error 
     avg += mm; 
    } 
    cout<< avg/mm.getS(); 
    return 0; 
} 

錯誤:

C2675一元 '++': '的std ::遊標' 不定義這種操作或轉換到類型接受的預先規定的操作,

非法間接,

C2678二進制「!=」:沒有操作員發現這需要類型'的std ::迭代器的左側操作數,

C2955'的std ::迭代器:使用類模板的熱曲IRES模板參數列表,

C2514'的std ::迭代器:類沒有構造

+0

[它不那麼簡單](https://stackoverflow.com/questions/8054273/how-to-implement-an-stl-style-iterator-and-avoid-common-pitfalls)。 –

+1

[C++ 11 foreach語法和自定義迭代器]的可能重複(http://stackoverflow.com/questions/7562356/c11-foreach-syntax-and-custom-iterator) –

+2

您應該始終包含實際的,完整的,錯誤消息。 – renemilk

回答

0

beginend功能需要是這樣的:

typename vector<TElement>::iterator begin() { 
    return vec.begin(); 
} 

typename vector<TElement>::iterator end() { 
    return vec.end(); 
} 

這是實際的迭代器類型的矢量返回。相比之下,std::iterator是完全不同且無關的類型。

+0

你可以解釋這個語法嗎? 「typename vector :: iterator」 – paulc

+0

@paulc:https://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and-typename-keywords –

0
typedef typename vector<TElement>::iterator Iterator; 

    Iterator begin() {//here is some problems 
     return vec.begin(); 
    } 

    Iterator end() { 
     return vec.end(); 
    } 

這樣會更好。

在模板聲明或定義中使用的名稱,這是 依賴於模板的參數被假定不命名類型除非 適用的名稱查找找到類型名或名稱由合格 關鍵字類型名稱。

我們需要確保vector<TElement>::iteratortype,而不是一個variable