2016-10-04 71 views
1

我试图超载运算符< <仅打印STL容器的每两个元素。但是,我在编译过程中有一个错误:错误:'e'不是类,名称空间或枚举

error: 'e' is not a class, namespace, or enumeration 

这里是我的代码:

#include <iostream> 
#include <vector> 

template<typename T> 
std::ostream& operator<<(std::ostream &out, T const &e){ 
    for(e::iterator it = e.begin(); it != e.end(); it = it + 2){ 
     out << *it << " "; 
    } 
    return out; 
} 

int main(){ 
    std::vector<int> v; 
    for(int i= 0; i < 10; i++){ 
     v.push_back(i); 
    } 

    std::cout << v; 
    return 0; 
} 
+0

通过'T'更换Ë:: iterator' :: iterator' – purplepsycho

+0

使用'汽车&& it' – 101010

回答

4

你有两个问题在这里。

一个是e::iterator。您无法通过对象访问成员类型,您需要使用该类型。相反,你应该只使用auto it = e.begin()。如果您不能使用C++ 11,那么你就需要使用

typename T::const_iterator it = e.begin() 

typename需要因为这个名字是依赖于一个模板参数,并且需要,而不是仅仅iteratorconst_iterator,因为该参数标记为const

然而,你的更严重的错误是首先使这个过载。

template<typename T> 
std::ostream& operator<<(std::ostream &out, T const &e){ 

这声明为std::ostream输出的过载为任何类型。这肯定会让你头疼,果然,如果解决的第一个错误,你想输出" "时得到一个模棱两可的函数调用错误:

main.cpp:7:20: error: use of overloaded operator '<<' is ambiguous (with operand types '__ostream_type' (aka 'basic_ostream<char, std::char_traits<char> >') and 'const char [2]') 
     out << *it << " "; 
     ~~~~~~~~~~^~~~ 

如果你真的想这个工作每个标准库容器,我想你会检查是否存在类似T::iterator的东西,并且只有在你的超负荷被启用的情况下才会这样。事情是这样的:

template<typename T, typename = typename T::iterator> 
std::ostream& operator<<(std::ostream &out, T const &e){ 
    for(auto it = e.begin(); it != e.end(); it = it + 2){ 
     out << *it << " "; 
    } 
    return out; 
} 

Live demo

相关问题