Почему C ++ имеет проблему перегрузки потока с настроенными векторами структуры? - PullRequest
0 голосов
/ 23 мая 2018

Я написал код, который должен перебирать вектор и печатать его содержимое.Я получаю сообщение об ошибке:

dfs.cpp: 45: 16: ошибка: нет совпадения для оператора * (тип операнда 'const traits') std :: cout << * c <<'';dfs.cpp: 44: 15: ошибка: невозможно привязать lvalue 'std :: ostream {aka std :: basic_ostream}' к std :: basic_ostream && 'std :: cout << * v <</blockquote>

Однако,итерация работает для вектора типа char

#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 way?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

При использовании iostream operators << & >> для istream и ostream либо для cout и cin, либо ifstream, ofstream или fstream объекты думают оэто как компилятор или тот, кто пишет компилятор ...

Это типы шаблонов.Пользователь создаст шаблон с различным количеством типов, которые могут быть встроены или определены пользователем.Чтобы дать пользователю такую ​​власть, как компилятор узнает, если ostream в вашем случае, который будет использовать list, будет list<int>, list<float>, list<yourType>?Таким образом, вы должны создать перегрузку самостоятельно для всех типов, которые вы хотите поддерживать operator>>() и operator<<().И как пользователь Spacemoose победил меня;вам придется преобразовать базовый тип с помощью функции stand a lone в тип, который уже работает с операторами.

0 голосов
/ 23 мая 2018

Полученная вами ошибка говорит о том, что у оператора ostream нет правила для применения к объектам типа trait.Самый лучший способ сделать это на C ++ - это перегрузить оператор <<, но вы сказали, что не хотите этого делать.

Учитывая это ограничение, вы можете перевести элемент 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) << ' ';
}

Если бы я видел такой код в работе, я бы ожидал, что у автора была причина не использовать более каноническую перегрузку оператораи я бы разочаровался, если бы они этого не сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...