2016-05-06 3 views
0

Так что я нашел этот код на здесь, что я работаю с:Добавление нескольких ints к одному векторному индексу? «Cout» не работает

#include <iostream> 
#include <cstdlib> 
#include <vector> 

using namespace std; 

struct Something{ 
    int x; 
    int y; 
}; 

int main() 
{ 
    vector <Something> v; 
    int x, y; 
    cin >> x >> y; 

    Something temp; 
    temp.x = x; 
    temp.y = y; 
    v.push_back(temp); 

    for (size_t i = 0; i < v.size(); i++) 
    { 
     cout << v[i] << endl; // Error: No operator "<<" matches these operands. Operand types are std::ostream << Something 
    } 
} 

В принципе, я пытаюсь получить несколько Интс в один вектор индекса. cout не работает, когда я пытаюсь распечатать содержимое вектора.

Прежде всего, я даже делаю это несколько раз подряд? Я относительно не знаком с C++.

И если я делаю это правильно, любые идеи относительно того, почему cout не работает? Я также пробовал v.push_back({x,y}), и это не сработало. Любая идея, что происходит с cout? Большое спасибо.


EDIT: Спасибо большое до сих пор. У меня есть еще один вопрос. Если бы я должен был изменить свой код, чтобы принимать несколько входов, а затем хотел, чтобы все в векторе отсортировалось по «y» от самого большого к самому маленькому.

Пример (Original Vector Contents (х, у))

12 4 1 2 4 10 1 1 1 2

отсортированные по 'у' (от наибольшего к наименьшему)

4 10 12 4 1 2 1 2 1 1

Я знаю, как это сделать обычный сорт, но не один по второму числу (y). Как мне это сделать? Большое спасибо.

ответ

2

Как и в случае ошибки, нет перегруженной функции operator<<, объявленной для вашей структуры.

Существуют три возможных решения: Во-первых, для вывода каждого члена структуры, как

std::cout << v[i].x << ' ' << v[i].y << '\n'; 

Другой создать функцию, которая делает выше, либо в виде функции-члена или как не - функция члена.

Третье решение заключается в создании перегруженный operator<< функции для структуры:

std::ostream& operator<<(std::ostream& os, Something const& something) 
{ 
    return os << something.x << ' ' something.y; 
} 

Я рекомендую вам find a good beginners book on C++ и читать главы о выходных, структур и классов, а также операторов и перегрузкой операторов.

+0

Спасибо вам большое. У меня есть еще один вопрос, но он не выглядит хорошо, когда я пишу его здесь (форматирование), поэтому я поставил его в свой вопрос как редактирование. Еще раз спасибо. –

+0

@G_Man Читайте о ['std :: sort'] (http://en.cppreference.com/w/cpp/algorithm/sort). Он может принимать аргумент функции сравнения, который может сравнивать все, что вы хотите. Или вы можете специализировать ['std :: greater'] (http://en.cppreference.com/w/cpp/utility/functional/greater) для своей структуры и использовать' std :: greater' в качестве компаратора при вызове ' станд :: sort'. –

0

operator<< не доступен автоматически между cout и объектами классов, определенных пользователем. Они должны быть определены до того, как вы сможете их использовать.

В вашем случае, вам нужно определить друг функцию внутри тела определения структуры в

friend std::ostream& operator<<(std::ostream& out, Something const& s); 

, чтобы иметь возможность использовать

cout << v[i] << endl; 

Реализацию функции не слишком сложно.

std::ostream& operator<<(std::ostream& out, Something const& s) 
{ 
    return out << s.x << " " << s.y; 
} 

Если вы хотите быть в состоянии использовать:

Something s; 
std::cin >> s; 

вы должны определить подобную функцию.

+0

Спасибо вам большое. У меня есть еще один вопрос, но он не выглядит хорошо, когда я пишу его здесь (форматирование), поэтому я поставил его в свой вопрос как редактирование. Еще раз спасибо. –

0

Проблема в том, что << является оператором. Он определен на std::cout (который является std::ostream) для нескольких типов. Например, он определен для int, поэтому это работает:

std::cout << 3; 

Однако, вы пытаетесь применить operator<< к вашему собственному Something класса, но это не имеет такого определения оператора. Вы можете добавить следующее:

struct Something { 
    // Other stuff here 
    friend std::ostream& operator<<(std::ostream& os, Something const& smth) ; 
}; 

std::ostream& operator<<(std::ostream& os, Something const& smth) { 
    os << "(" << smth.x << ", " << smth.y << ")"; 
    return os; 
} 

Тогда ваш код должен работать. Перегрузка этого оператора на самом деле сложнее, чем перегрузка других, потому что вам нужно понять, что делает friend.

Edit:

friend на самом деле не нужны в вашем случае, потому что x и y являются общедоступными. Но в общем случае вам нужно, чтобы вы могли печатать частных членов своего класса.

Edit 2:

Чтобы сделать предыдущий редактировать ясно, вы можете опустить все в-структуры объявление оператора, так как он будет искаться в глобальном масштабе. Вам это нужно только (а затем оно должно быть friend), если оператору необходимо прочитать частных членов.

+0

Собственно, когда компилятор видит выражение типа 'cout << s', он вызывает _global function_' operator << ', поэтому вам нужно объявить его как« друга »внутри класса' Something' :) – someOne

+0

You «Верно, спасибо! Скорректировано с учетом этого. –

+0

Спасибо вам большое. У меня есть еще один вопрос, но он не выглядит хорошо, когда я пишу его здесь (форматирование), поэтому я поставил его в свой вопрос как редактирование. Еще раз спасибо. –