Что такое бинарная ошибка

Сохраняю с CSV файла в вектор. После этого нужно вывести 5 случайных людей:

vector<vector<string>> Man;

for (int i = 0; i < 5; i++) {
    auto  k = rand() % Man.size();

    for (auto l = Man[k].begin(); l < Man[k].end(); l++) {
        cout << Man[k][l] << " ";                             // ←——— тут ошибка
    }

    cout << endl;
}

Ошибка:

C2679    бинарный "[": не найден оператор, принимающий правый операнд типа "std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>" (или приемлемое преобразование отсутствует)   Project9    c:usersost1m1ronsourcereposproject9project9source.cpp    107

eanmos's user avatar

eanmos

6,6416 золотых знаков29 серебряных знаков52 бронзовых знака

задан 1 авг 2018 в 15:29

ost1m1ron -'s user avatar

1

Ошибка в том, что вы пытаетесь получить значение отправляя в operator[] не индекс(size_t), а итератор!!

Когда вы пишите auto l = Man[k].begin(), это и есть итератор на конкретный элемент, т.е. чтобы получить данные достаточно просто разыменовать итератор.

vector<vector<string>> Man;
for (int i = 0; i < 5; i++)
{
    auto  k = rand() % Man.size();
    for (auto l = Man[k].begin(); l < Man[k].end(); ++l)
    {
        cout << *l << " "; // SUPERMAN
    }
    cout << endl;
}

Пару советов:

  1. Используйте префиксный инкремент (++i, а не i++). Это особенно касается невстроенных типов.
  2. Вы пишите в условии цикла l < Man[k].end(). Вы на каждой итерации вызываете Man::operator[] и end(). Лучше будет получить перед внутренним циклом значение end() и дальше сравнивать. И сравнивать не оператором< а оператором!=.

ответ дан 1 авг 2018 в 15:43

acade's user avatar

acadeacade

1,7361 золотой знак5 серебряных знаков10 бронзовых знаков

3

 for (auto l = Man[k].begin(); l < Man[k].end(); l++) {
     cout << Man[k][l] << " "; 
 }
l  это итератор и нельзя его использовать как индекс.
Поэтому нужно поменять на:

for (auto l = Man[k].begin(); l != Man[k].end(); l++) {
    cout << *l << " "; 
}

ответ дан 1 авг 2018 в 15:49

AR Hovsepyan's user avatar

AR HovsepyanAR Hovsepyan

15.8k3 золотых знака13 серебряных знаков30 бронзовых знаков

2

SKoDa

0 / 0 / 0

Регистрация: 30.03.2020

Сообщений: 41

1

Ошибка — не найден оператор «==»

14.12.2020, 20:23. Показов 1275. Ответов 9

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый вечер! При компиляции программы вылетает ошибка —
Бинарный «==»: не найден оператор, принимающий левый операнд типа » (или приемлемое преобразование отсутствует)

Код программы:
Main

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <list>
#include "Aircraft.h"
#include <windows.h>
#include <algorithm>
#include <string>
using namespace std;
 
// Функция выводит список фильмов на консоль
 
void show(list<Aircraft> aircraft)
{
    for (list<Aircraft>::iterator it = aircraft.begin(); it != aircraft.end(); it++)
        cout << *it << endl;
    cout << endl;
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    list<Aircraft> aircraft;
    
    //--------------------------------------------------------------
    aircraft.push_back(Aircraft(222, "Москва", "13:30", "Пассажирский"));
    aircraft.push_back(Aircraft(101, "Казань", "14:00", "Грузовой"));
    aircraft.push_back(Aircraft(100, "Самара", "10:00", "Военный"));
    aircraft.push_back(Aircraft(109, "Петрозаводск", "11:30", "Частный"));
    //--------------------------------------------------------------
 
    //--------------------------------------------------------------
    aircraft.sort(lessNumber);
    cout << "----Список по возрастанию номеров рейса----" << endl;
    show(aircraft);
    //--------------------------------------------------------------
 
 
    //--------------------------------------------------------------
    int keyNumber = 222;
    cout << "----Поиск рейса по номеру----" << endl;
    search(aircraft, keyNumber);
    //--------------------------------------------------------------
 
 
    system("pause");
 
}

Aircraft.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#pragma once
#include "Aircraft.h"
#include <iostream>
using namespace std;
 
Aircraft::Aircraft(int Number, string Target, string Time, string Type)
{
    this->Number = Number;
    this->Target = Target;
    this->Time = Time;
    this->Type = Type;
}
 
Aircraft::~Aircraft()
{
}
 
bool lessNumber(Aircraft& aircraft1, Aircraft& aircraft2)
{
    return aircraft1.Number < aircraft2.Number;
}
 
void search(list<Aircraft> aircraft, int keyNumber)
{
    list<Aircraft>::iterator it;
    it = find(aircraft.begin(), aircraft.end(), keyNumber);
 
    cout << "Рейс с номером " << keyNumber << (it == aircraft.end() ? "Не найден" : "Найден")
        << endl;
}
 
ostream& operator<<(ostream& cout, Aircraft& aircraft)
{
    return  cout << "|" << aircraft.Number << setw(20)
                 << aircraft.Target << setw(20)  
                 << aircraft.Time   << setw(20) 
                 << aircraft.Type   <<  "|" << endl;
    
}

Aircraft.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#pragma once
#include <string>
#include <list>
#include <algorithm>
#include <iomanip>
#include <iostream>
using namespace std;
 
class Aircraft
{
private:
    string Number;
    string Target;
    string Time;
    string Type;
public:
    Aircraft(int Number, string Target, string Time, string Type);
    ~Aircraft();
 
    friend ostream& operator<<(ostream& cout, Aircraft& aircraft);
 
    // Comparators
    friend bool lessNumber(Aircraft& aircraft1, Aircraft& aircraft2);
    friend void search(list <Aircraft> aircraft, int keyNumber);
};
 
bool lessNumber(Aircraft& aircraft1, Aircraft& aircraft2);
void search(list <Aircraft> aircraft, int keyNumber);



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

14.12.2020, 20:23

9

610 / 415 / 151

Регистрация: 11.01.2019

Сообщений: 1,746

14.12.2020, 21:32

2

Значит не определен оператор сравнения. Определяй — в чем проблема?!



0



SKoDa

0 / 0 / 0

Регистрация: 30.03.2020

Сообщений: 41

14.12.2020, 21:37

 [ТС]

3

jugu,

C++
1
2
3
4
bool operator == (Aircraft& aircraft1, Aircraft& aircraft2)
{
    return aircraft1.Number == aircraft2.Number;
}

Определил, всё равно при компиляции остается ошибка



0



610 / 415 / 151

Регистрация: 11.01.2019

Сообщений: 1,746

14.12.2020, 21:39

4

Цитата
Сообщение от SKoDa
Посмотреть сообщение

Определил, всё равно при компиляции остается ошибка

В какой именно строке и что пишет?



0



0 / 0 / 0

Регистрация: 30.03.2020

Сообщений: 41

14.12.2020, 21:43

 [ТС]

5

jugu, знать бы… В интернете искал эту ошибку тоже ничего такого не нашёл

Миниатюры

Ошибка - не найден оператор "=="
 



0



MasteRX

11 / 33 / 15

Регистрация: 29.04.2014

Сообщений: 223

14.12.2020, 21:47

6

Цитата
Сообщение от SKoDa
Посмотреть сообщение

jugu,
bool operator == (Aircraft& aircraft1, Aircraft& aircraft2)
{
return aircraft1.Number == aircraft2.Number;
}

Определил, всё равно при компиляции остается ошибка

Добрый вечер,

возможно (могу ошибаться) Вам также стоит определить оператор «==» с константными параметрами?

C++
1
2
3
4
bool operator == (const Aircraft& aircraft1, const Aircraft& aircraft2)
{
    return aircraft1.Number == aircraft2.Number;
}



0



SKoDa

0 / 0 / 0

Регистрация: 30.03.2020

Сообщений: 41

14.12.2020, 21:53

 [ТС]

7

MasteRX, не помогло

Добавлено через 1 минуту

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
C:Program Files (x86)Microsoft Visual Studio2019EnterpriseVCToolsMSVC14.25.28610includexutility(4640,1): error C2679: бинарный "==": не найден оператор, принимающий правый операнд типа "const _Ty" (или приемлемое преобразование отсутствует)
1>        with
1>        [
1>            _Ty=int
1>        ]
1>C:UsersuserDesktopInternet ExplorerPROECTSVSППП2 курс1 семестр№6.26.2Aircraft.cpp(23,6): message : может быть "bool operator ==(Aircraft &,Aircraft &)" [найдено при поиске с зависимостью от аргументов]
1>C:UsersuserDesktopInternet ExplorerPROECTSVSППП2 курс1 семестр№6.26.2Aircraft.cpp(28,6): message : или       "bool operator ==(const Aircraft &,const Aircraft &)" [найдено при поиске с зависимостью от аргументов]
1>C:Program Files (x86)Microsoft Visual Studio2019EnterpriseVCToolsMSVC14.25.28610includexutility(4640,1): message : при попытке сопоставить список аргументов "(Aircraft, const _Ty)"
1>        with
1>        [
1>            _Ty=int
1>        ]
1>C:Program Files (x86)Microsoft Visual Studio2019EnterpriseVCToolsMSVC14.25.28610includexutility(4656): message : выполняется компиляция ссылки на экземпляр шаблон функции "std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<_Ty>>> std::_Find_unchecked1<std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<_Ty>>>,int>(std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<_Ty>>>,const std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<_Ty>>>,const int &,std::false_type)"
1>        with
1>        [
1>            _Ty=Aircraft
1>        ]
1>C:Program Files (x86)Microsoft Visual Studio2019EnterpriseVCToolsMSVC14.25.28610includexutility(4662): message : выполняется компиляция ссылки на экземпляр шаблон функции "std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<_Ty>>> std::_Find_unchecked<std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<_Ty>>>,int>(const std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<_Ty>>>,const std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<_Ty>>>,const int &)"
1>        with
1>        [
1>            _Ty=Aircraft
1>        ]
1>C:UsersuserDesktopInternet ExplorerPROECTSVSППП2 курс1 семестр№6.26.2Aircraft.cpp(36): message : выполняется компиляция ссылки на экземпляр шаблон функции "_InIt std::find<std::_List_iterator<std::_List_val<std::_List_simple_types<_Ty>>>,int>(_InIt,const _InIt,const int &)"
1>        with
1>        [
1>            _InIt=std::_List_iterator<std::_List_val<std::_List_simple_types<Aircraft>>>,
1>            _Ty=Aircraft
1>        ]



0



610 / 415 / 151

Регистрация: 11.01.2019

Сообщений: 1,746

14.12.2020, 21:57

8

Ошибка понятна. Ты сравниваешь объект Aircraft с целым числом, а оператора сравнения нет. Это строка 26, файл Aircraft.cpp.



0



0 / 0 / 0

Регистрация: 30.03.2020

Сообщений: 41

14.12.2020, 22:03

 [ТС]

9

jugu, как её исправить? если не трудно, можете помочь?



0



jugu

610 / 415 / 151

Регистрация: 11.01.2019

Сообщений: 1,746

14.12.2020, 22:12

10

Цитата
Сообщение от SKoDa
Посмотреть сообщение

как её исправить? если не трудно, можете помочь?

Да там и кроме этой ошибки еще куча косяков…

Добавлено через 6 минут
Оч кривой код…

Пробуй модифицировать функцию поиска так:

C++
1
2
3
4
5
6
7
8
9
void search(list<Aircraft> aircraft, int keyNumber)
{
    list<Aircraft>::iterator it;
    auto str_keyNumber = to_string(keyNumber);
    it = find_if(aircraft.begin(), aircraft.end(), [&str_keyNumber] (auto& flight) { if (str_keyNumber == flight.getNumber()) return true; return false; } );
 
    cout << "Рейс с номером " << keyNumber << (it == aircraft.end() ? "Не найден" : "Найден")
        << endl;
}

И добавь в класс Aircraft функцию:

C++
1
string getNumber() const { return Number; }



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

14.12.2020, 22:12

10

Меня попросили создать программу с бензиновым насосом для моей реферальной курсовой работы, и у меня возникла проблема с ее запуском, в настоящий момент это главное, что выводит компилятор при попытке скомпилировать код полный диалог сборки здесь

1> m: visual studio 2010 projects referral referral main.cpp (56): ошибка C2678: двоичный файл ‘>>’: не найден оператор, который принимает левый операнд типа ‘std :: istream’ ( или нет приемлемого преобразования)

#include <iostream>
#include <istream>
#include <ostream>
#include <fstream>
#include <ctime>
#include <cmath>
#include <string>
#include <Windows.h>

using namespace std;
int reciept();
int pump;
int petrol;

int main()
{
bool exit = false;
int code;
string p1w ("Waiting");
string p2w ("Waiting");
string p3w ("Waiting");
string p4w ("Waiting");
string p1r ("Ready");
string p2r ("Ready");
string p3r ("Ready");
string p4r ("Ready");

if (GetAsyncKeyState(VK_ESCAPE))
{
exit = true;
}

cout << "***************************************************" << endl;
cout << "*Liquid Gold v1.0.0 Last revised 18/07/13         *" << endl;
cout << "*The process of processing transactions is simple,*" << endl;
cout << "*activate a pump by entering its code shown below.*" << endl;
cout << "*After pump operation is verified (generally 10   *" << endl;
cout << "*seconds though this may vary) the attendant      *" << endl;
cout << "* will be able to enter the amount of petrol to 3 *" << endl;
cout << "*decimal places which will then be converted based*" << endl;
cout << "*on a predetermined price (which can be altered in*" << endl;
cout << "*price.txt) and once this process is complete a   *" << endl;
cout << "*receipt will be created (you will need seperate  *" << endl;
cout << "*software in order to print this recipt) and the  *" << endl;
cout << "*transaction will be terminated.                  *" << endl;
cout << "*© Simple Software Solutions 2013                 *" << endl;
cout << "***************************************************" << endl << endl;
system("Pause");

while (exit == false)
{

cout << "       Pump (1) - " << p1w << "        Pump (2) - " << p2w << endl << endl << endl;
cout << "       Pump (3) - " << p3w << "        Pump (4) - " << p4w << endl << endl << endl;

cin >> "Please enter a pump code:" >> code;

if (code == 1)
{
swap (p1w, p1r);
pump = 1;
cin >> "Please enter the amount of petrol deposited" >> petrol;
break;
}

else if (code == 2)
{
swap (p2w, p2r);
pump = 2;
cin >> "Please enter the amount of petrol deposited" >> petrol;
break;
}

else if (code == 3)
{
swap (p3w, p3r);
pump = 3;
cin >> "Please enter the amount of petrol deposited" >> petrol;
break;
}

else if (code == 4)
{
swap (p4w, p4r);
pump = 4;
cin >> "Please enter the amount of petrol deposited" >> petrol;
break;
}
else
{
cout << "Invalid pump code entered";

}
reciept();
{
ofstream transactions;
transactions.open ("reciept.txt");
transactions << "****************************************************/n";
transactions << "                        SALE                        /n";
transactions << "****************************************************/n /n";
}
}

return 0;
}

Я осмотрелся, и единственное решение, которое я могу найти для этой ошибки, — это то, что я уже сделал, и я не вижу другого решения.

Кто-нибудь более наблюдательный, чем я, хочет посмотреть и сказать мне, где я иду не так?

Также я знаю, что мой код — неэффективный беспорядок, и я прошу прощения за это.

2

Решение

+ Изменить

cin >> "Please enter a pump code:" >> code;

в

cout << "Please enter a pump code: ";
cin >> code;

Вам нужно изменить все cin >> "string" в вашем коде. Это не означает приглашение пользователя для ввода. Вместо этого вы фактически пытаетесь записать строковый литерал.

14

Другие решения

Просто для некоторого дополнительного цвета поверх ответа Янга, это не «двоичная ошибка», как предлагается в заголовке. Сообщение об ошибке относится к binary'>>', >> бинарный оператор, и бинарные операторы принимают два операнда, по одному на каждой стороне. + а также - функционируют как бинарные операторы в следующем:

1 + 2
var1 - var2

унарный Оператор принимает только один операнд. & а также - действуют как унарные операторы в следующем:

my_pointer = &n;
int var3 = -5;

Важная часть в сообщении об ошибке, которое вы получаете:

двоичный ‘>>’: не найден оператор, который принимает левый операнд
тип ‘std :: istream’ (или нет приемлемого преобразования)

последний бит, «или нет приемлемого преобразования». Там, безусловно, есть >> оператор, который принимает левый операнд std::istream, но нет >> определенный оператор, который принимает строковый литерал справа, поскольку строковые литералы не могут быть назначены. В этом случае, std::cin >> myvar берет вещи из std::cin и пытается положить его в переменную myvar, но вы никак не можете вставить что-либо в строковый литерал, например "Please enter a pump code:", как это было бы, как пытаться сделать:

"Please enter a pump code:" = 5;

что, очевидно, глупость.

4

При компиляции Visual Studio выдает ошибку:
error C2678: бинарный «<«: не найден оператор, принимающий левый операнд типа «const _Ty» (или приемлемое преобразование отсутствует).
Что это значит и как ее исправить?
P.S. Если данные пояснения помогут, то вот они:
Структура Shape — прямоугольник, первые две координаты у которого (x0, y0) — левая нижняя его вершина, вторые две
(x1, y1) — правая верхняя. Вершины прямоугольника лежат в узлах целочисленной решетки.
Структура Point — точка хранит координаты точки x0, y0.
Функция PointInShape проверяет, лежит ли точка в прямоугольнике.
Функция PointInArea проверяет, лежит ли точка в каком-нибудь из прямоугольников, а также посещали ли мы ее ранее.
Вектор shapes — набор прямоугольников
Словарь used хранит информацию, посещена ли вершина point.
Словарь dist хранит расстояния до вершин от стартовой.
Во входном файле задано количество прямоугольников n и в следующих n строках заданы прямоугольники в виде
координат левой нижней и правой верхней вершин.
В последних двух строках заданы координаты стартовой и конечной вершин.
Разрешено посещать только те вершины, которые находятся хотя бы в одном из многоугольников.
Ходить можно только конем, как в шахматах (на две клетки вверх/вниз и на одну в перпендикулярном направлении).
Необходимо вывести в выходной файл расстояние length между вершинами или -1, если между ними нет пути.
Пример входных данных:
3
0 0 2 2
1 2 4 2
4 1 6 3
0 0
1 1
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <cstdlib>
#include <vector>
#include <map>
#include <fstream>
#include <queue>
using namespace std;


struct Shape {
	long x0, y0, x1, y1;
	explicit Shape(const long X0, const long Y0, const long X1, const long Y1) {
		x0 = X0;
		y0 = Y0;
		x1 = X1;
		y1 = Y1;
	}
};

struct Point {
	long x0, y0;
	explicit Point(const long X0,const long Y0) {
		x0 = X0;
		y0 = Y0;
	}
};

bool PointInShape(const Shape& shape,const Point& point) {
	if (point.x0 >= shape.x0 && point.x0 <= shape.x1 &&
		point.y0 >= shape.y0 && point.y0 <= shape.y1) return true;
	return false;
}

bool PointInArea(const vector <Shape>& sh, const map <Point, bool>& u,const Point& point) {
	bool InUsed = u.count(point);
	for (const Shape& s : sh) {
		if (PointInShape(s, point) && !InUsed) return true;
	}
	return false;
}

int main() {
	ifstream file_in("infile.txt");
	ofstream file_out("outfile.txt");
	long n;
	file_in >> n;
	long x1, y1, x2, y2;
	vector <Shape> shapes;
	map <Point, bool> used;
	map <Point, long> dist;
	for (int i = 0; i < n; ++i) {
		file_in >> x1 >> y1 >> x2 >> y2;
		shapes.push_back(Shape( x1, y1, x2, y2 ));
	}
	file_in >> x1 >> y1 >> x2 >> y2;
	const Point start(x1, y1);
	const Point end(x2, y2);
	queue <Point> points;
	points.push(start);
	dist[start] = 0;
	long length = -1;
	while (!points.empty()) {
		Point point = points.front();
		points.pop();
		for (const Point& p : {Point(point.x0+2, point.y0+1),
			Point(point.x0+2, point.y0-1),
			Point(point.x0+1, point.y0+2),
			Point(point.x0-1, point.y0-2)}) {
			if (p.x0 == end.x0 && p.y0 == end.y0) {
				length = dist[point] + 1;
				file_out << length;
				return 0;
			}
			else {
				if (PointInArea(shapes, used, p)) {
					points.push(p);
					dist[p] = dist[point] + 1;
				}
			}
		}
	}
	file_out << length;
	return 0;
}

не пойму, почему remove_if работает как надо, а remove выдают ошибку.

std::list<Element> items;

void RemoveElement(const Element & item)
{
    items.remove_if([&](const Element & value) {return item.GetName() == value.GetName(); });
    items.remove(item);
}

задан 9 мар ’18 в 18:23

3

Добавьте оператор сравнения, вроде

bool operator==(const Element & item, const Element & value) 
{
    return item.GetName() == value.GetName(); 
}

ответ дан 9 мар ’18 в 18:37

HarryHarry

180k13 золотых знаков99 серебряных знаков205 бронзовых знаков

1

Что значит «почему»? Я не знаю, что такое "xxx", но скорее всего в сообщении об ошибке у вас ясно сказано, что оператора == для сравнения Element с Element у вас нет. Потому и ошибка.

Возможно также, что оператор-то вы написали, но, как часто бывает, пренебрежение правилами константной корректности сделало его невызываемым в данном случае.

ответ дан 9 мар ’18 в 18:33

AnTAnT

67.3k3 золотых знака56 серебряных знаков132 бронзовых знака

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ list stl или задайте свой вопрос.

Понравилась статья? Поделить с друзьями:
  • Что такое априорная ошибка
  • Что такое аномальные ошибки
  • Что такое алгоритмическая ошибка
  • Что такое алгоритм обратного распространения ошибки
  • Что такое абсолютная и относительная ошибка измерения