代码之家  ›  专栏  ›  技术社区  ›  hasherBaba

为什么C++具有自定义结构向量的流过载问题?

  •  0
  • hasherBaba  · 技术社区  · 6 年前

    我写了一个代码,它必须迭代一个向量并打印它的内容。我得到一个错误:

    fs.cpp:45:16:错误:不匹配运算符*(操作数类型为常量特性) STD::CUT & LT;**C<& lt; DFS.CPP:44∶15:错误:不能绑定At*STD::OSWATE { AKA STD::Basic ToSooS}} STD::CUT & LT;*L.V<

    但是,迭代适用于类型为的向量 烧焦

    #include<iostream>
    #include<list>
    #include<vector>
    #include<stdio.h>
    
    using namespace std;
    
    struct traits
    {
        int x;
        bool visit;
        std::list<int> friends;
    };
    
    int main()
    {
        cout << "Enter the number of employees: " << endl;
        int noOfEmployees, noOfFriends;
        cin>>noOfEmployees;
        std::vector<traits> employees;
        int i = 0; int j;
        while(noOfEmployees--){
            traits v;
            v.x = i;
            cout << "Enter the no of friends: " << endl;
            cin >> noOfFriends;
            while(noOfFriends--){
                cin>>j;
                v.friends.push_back(j);
            }
            v.visit = false;
            employees.push_back(v);
        }
    
        std::vector<char> path;
        path.push_back('a');
        path.push_back('l');
        path.push_back('i');
        path.push_back('a');
        for (std::vector<char>::const_iterator i = path.begin(); i != path.end(); ++i){
            std::cout << *i << ' ';
        }
        for(std::vector<traits>::iterator v = employees.begin(); v != employees.end(); ++v){
            std::cout<<*v<<endl;
        }
    }
    

    我看到的答案很少,但我想在不重载运算符的情况下进行此操作,正确的或更多的答案是什么? C++ NIC 方式?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Spacemoose    6 年前

    您得到的错误告诉您,ostream运算符没有应用于类型为的对象的规则 trait . 最简单的“C++ NIC”方式是超载。 << 接线员,但你说过你不想这样做。

    考虑到这个约束,您可以将 traits 将项目转换为Ostream运算符支持的内容。一种合理的方法是使用命名空间级别的非成员函数

    std::string to_string(const traits& t) {
    /// Code to generate a string representation of your traits object
    }
    for (const auto emp& : employees){
        std::cout<< to_string(emp) << ' ';
    }
    

    如果我在产品中看到这样的代码,我希望作者有理由不使用更规范的操作符重载,如果他们不使用,我会失望的。

        2
  •  1
  •   Francis Cugler    6 年前

    当使用 iostream operators << 和; >> 对于 istream ostream 要么是为了 cout cin ifstream , ofstream fstream 对象以编译器或编写编译器的人的方式来考虑它…

    这些是模板类型。用户将创建一个具有各种类型的模板,这些类型可以内置或自定义用户定义。为了给用户这种能力,编译器如何知道 鸵鸟 在您的情况下,将使用 list 是一个 list<int> , list<float> , list<yourType> ?因此,您必须为所有要支持的类型创建重载 operator>>() operator<<() . 当用户spacemoose击败我时,您必须通过stand a lone函数将底层类型转换为已经与运算符一起工作的类型。