错误:"e"不是类、命名空间或枚举

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

本文关键字:命名空间 枚举 错误      更新时间:2023-10-16

我试图重载操作符<<用于仅打印STL容器的每两个元素。但是我在编译过程中有一个错误:

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;
}

这里有两个问题。

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

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

需要typename,因为名称依赖于模板参数,需要const_iterator而不仅仅是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;
} 

现场演示