2016-06-10 147 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