Сохраняю с 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
|
karlhildekruger 51 / 35 / 21 Регистрация: 09.05.2022 Сообщений: 268 |
||||||||
|
1 |
||||||||
|
05.06.2022, 21:27. Показов 1667. Ответов 13 Метки нет (Все метки)
Ошибка: Код Серьезность Код Описание Проект Файл Строка Состояние подавления Ошибка C2679 бинарный "<<": не найден оператор, принимающий правый операнд типа "std::vector<stud::Student,std::allocator<stud::Student>>" (или приемлемое преобразование отсутствует) 204 геттер из класса Institute, который я пытаюсь сериализовать в текстовый файл
0 |
|
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
05.06.2022, 21:27 |
|
Ответы с готовыми решениями: Ошибка C2679: бинарный ‘=’: не найден оператор, принимающий правый операнд типа ‘double’ #include… Error C2679: бинарный «=»: не найден оператор, принимающий правый операнд типа Возвращение кортежа — error C2679: бинарный «=»: не найден оператор, принимающий правый операнд типа tuple<X**, Math, int, int,…
#include "stdafx.h" #include <iostream>
13 |
|
17457 / 9284 / 2269 Регистрация: 30.01.2014 Сообщений: 16,257 |
|
|
05.06.2022, 21:48 |
2 |
|
karlhildekruger, вам нужно определить оператор << для типа
0 |
|
karlhildekruger 51 / 35 / 21 Регистрация: 09.05.2022 Сообщений: 268 |
||||
|
05.06.2022, 22:23 [ТС] |
3 |
|||
|
Это правильно?
Выдает ошибку Код Серьезность Код Описание Проект Файл Строка Состояние подавления Ошибка C2679 бинарный "<<": не найден оператор, принимающий правый операнд типа "const _Ty" (или приемлемое преобразование отсутствует)
0 |
|
17457 / 9284 / 2269 Регистрация: 30.01.2014 Сообщений: 16,257 |
|
|
05.06.2022, 23:25 |
4 |
|
Это правильно? Правильно. И для Student тоже должен быть такой оператор.
Выдает ошибку В какой строке?
0 |
|
51 / 35 / 21 Регистрация: 09.05.2022 Сообщений: 268 |
|
|
05.06.2022, 23:35 [ТС] |
5 |
|
os << vect[i] << «t»; Ошибка в этой строке
0 |
|
17457 / 9284 / 2269 Регистрация: 30.01.2014 Сообщений: 16,257 |
|
|
05.06.2022, 23:59 |
6 |
|
Ошибка в этой строке …
для Student тоже должен быть такой оператор
0 |
|
karlhildekruger 51 / 35 / 21 Регистрация: 09.05.2022 Сообщений: 268 |
||||
|
06.06.2022, 00:12 [ТС] |
7 |
|||
|
Не работает. Выводит те же ошибки
0 |
|
17457 / 9284 / 2269 Регистрация: 30.01.2014 Сообщений: 16,257 |
|
|
06.06.2022, 00:13 |
8 |
|
Не работает. Значит вы что-то не так сделали.
0 |
|
karlhildekruger 51 / 35 / 21 Регистрация: 09.05.2022 Сообщений: 268 |
||||||||||||
|
06.06.2022, 00:16 [ТС] |
9 |
|||||||||||
|
Student.h
institute.h
serializer.h
0 |
|
2346 / 1869 / 607 Регистрация: 29.06.2020 Сообщений: 7,055 |
|
|
06.06.2022, 00:32 |
10 |
|
os << s.getStudentNo(); Эти методы у класса Student, не константные, а вы пытаетесь их вызвать от константного объекта. Добавлено через 2 минуты
string StudentNo = «123»; Улыбнуло )
0 |
|
DrOffset 17457 / 9284 / 2269 Регистрация: 30.01.2014 Сообщений: 16,257 |
||||
|
06.06.2022, 00:40 |
11 |
|||
|
Выводит те же ошибки Ну, как минимум не те же.
Также у вас в реализации оператора << для Student используется константная ссылка (что правильно), но функции используемые внутри него
0 |
|
51 / 35 / 21 Регистрация: 09.05.2022 Сообщений: 268 |
|
|
06.06.2022, 01:43 [ТС] |
12 |
|
сделал для всех операторов определение, все сделал константными, появились другие ошибки Код Серьезность Код Описание Проект Файл Строка Состояние подавления Ошибка LNK2005 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class stud::Student const &)" (??6@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AEAV01@AEBVStudent@stud@@@Z) уже определен в Main.obj C:УЧЕБАСРСSerializer.obj 1 Код Серьезность Код Описание Проект Файл Строка Состояние подавления Ошибка LNK1169 обнаружен многократно определенный символ - один или более 1
0 |
|
Вездепух
10982 / 5965 / 1630 Регистрация: 18.10.2014 Сообщений: 14,962 |
|
|
06.06.2022, 02:04 |
13 |
|
появились другие ошибки Ну так в ошибке же написано, в чем проблема. Скорее всего вы засунули определение оператора В заголовочный файл можно помещать только определения особых категорий 1. Определения шаблонов Ваш оператор
0 |
|
alecss131 Модератор
2447 / 1007 / 347 Регистрация: 11.08.2017 Сообщений: 3,101 |
||||||||
|
06.06.2022, 11:18 |
14 |
|||||||
|
Зачем так сложно? можно короче
0 |
|
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
06.06.2022, 11:18 |
|
14 |
I’ve got the following when building a graph.
#include <vector>
using namespace std;
template<class T>
class Node
{
private:
T data;
Node<T> *link;
vector<T> neighbors;
public:
Node(){neighbors = new vector<T>();};
};
int main()
{
Node<int> n;
return 0;
}
… which returns the error C2679: binary ‘=’: no operator found…
I’m using VS2010. What’s wrong?
Thanks!
asked Nov 17, 2010 at 16:17
The new operator returns a pointer type, but your member variable neighbors is not a pointer. So you’re assigning a pointer (the result of new) to a non-pointer type. Your neighbors variable needs to be a pointer: vector<T>* neighbors.
But I think you’re probably misunderstanding the use of new here. You probably shouldn’t even use a vector pointer at all. Just remove the line neighbors = new vector<T>(). The vector object will be automatically initialized and ready for use.
In C++, the new keyword allocates and initializes objects on the heap, which then must be freed later using delete. It’s preferable to avoid the new keyword by simply initializing the object as an automatic variable, like:
vector<T> neighbors;
This way, you don’t have to worry about memory management, and the vector object will automatically be destroyed when it goes out of scope.
answered Nov 17, 2010 at 16:19
![]()
Charles SalviaCharles Salvia
52.2k13 gold badges128 silver badges140 bronze badges
1
vector<T> neighbors;
neighbors = new vector<T>();
neighbours is not a pointer.
The whole point of using vectors is not managing the memory explicitly.
In fact in your node constructor, neighbours is default-initialized, so just don’t initialize. Your constructor may look like this:
Node(){}
So you can just omit it 
answered Nov 17, 2010 at 16:19
![]()
Armen TsirunyanArmen Tsirunyan
130k59 gold badges324 silver badges434 bronze badges
| description | title | ms.date | f1_keywords | helpviewer_keywords | ms.assetid |
|---|---|---|---|---|---|
|
Learn more about: Compiler Error C2679 |
Compiler Error C2679 |
11/04/2016 |
C2679 |
C2679 |
1a5f9d00-9190-4aa6-bc72-949f68ec136f |
Compiler Error C2679
binary ‘operator’ : no operator found which takes a right-hand operand of type ‘type’ (or there is no acceptable conversion)
To use the operator, you must overload it for the specified type or define a conversion to a type for which the operator is defined.
The following sample generates C2679:
// C2679.cpp class C { public: C(); // no constructor with an int argument } c; class D { public: D(int) {} D(){} } d; int main() { c = 10; // C2679 d = 10; // OK }
Сохраняю с 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
Ответы (2 шт):
Ошибка в том, что вы пытаетесь получить значение отправляя в 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()и дальше сравнивать. И сравнивать неоператором<аоператором!=.
→ Ссылка
Автор решения: AR Hovsepyan
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 << " ";
}
→ Ссылка

Error C2679: бинарный «<<«: не найден оператор, принимающий правый операнд типа «std::string» (или приемлемое