Сохраняю с 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
6,6416 золотых знаков29 серебряных знаков52 бронзовых знака
задан 1 авг 2018 в 15:29
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;
}
Пару советов:
- Используйте префиксный инкремент (
++i
, а неi++
). Это особенно касается невстроенных типов. - Вы пишите в условии цикла
l < Man[k].end()
. Вы на каждой итерации вызываетеMan::operator[]
иend()
. Лучше будет получить перед внутренним циклом значениеend()
и дальше сравнивать. И сравнивать неоператором<
аоператором!=
.
ответ дан 1 авг 2018 в 15:43
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 HovsepyanAR Hovsepyan
15.8k3 золотых знака13 серебряных знаков30 бронзовых знаков
2
SKoDa 0 / 0 / 0 Регистрация: 30.03.2020 Сообщений: 41 |
||||||||||||
1 |
||||||||||||
Ошибка — не найден оператор «==»14.12.2020, 20:23. Показов 1275. Ответов 9 Метки нет (Все метки)
Добрый вечер! При компиляции программы вылетает ошибка — Код программы:
Aircraft.cpp:
Aircraft.h:
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,
Определил, всё равно при компиляции остается ошибка
0 |
610 / 415 / 151 Регистрация: 11.01.2019 Сообщений: 1,746 |
|
14.12.2020, 21:39 |
4 |
Определил, всё равно при компиляции остается ошибка В какой именно строке и что пишет?
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 |
|||
jugu, Определил, всё равно при компиляции остается ошибка Добрый вечер, возможно (могу ошибаться) Вам также стоит определить оператор «==» с константными параметрами?
0 |
SKoDa 0 / 0 / 0 Регистрация: 30.03.2020 Сообщений: 41 |
||||
14.12.2020, 21:53 [ТС] |
7 |
|||
MasteRX, не помогло Добавлено через 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 |
|||||||
как её исправить? если не трудно, можете помочь? Да там и кроме этой ошибки еще куча косяков… Добавлено через 6 минут Пробуй модифицировать функцию поиска так:
И добавь в класс Aircraft функцию:
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 бронзовых знака