Сохраняю с 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
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 }
karlhildekruger 46 / 31 / 19 Регистрация: 09.05.2022 Сообщений: 259 |
||||||||
1 |
||||||||
05.06.2022, 21:27. Показов 1626. Ответов 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 |
17427 / 9259 / 2264 Регистрация: 30.01.2014 Сообщений: 16,215 |
|
05.06.2022, 21:48 |
2 |
karlhildekruger, вам нужно определить оператор << для типа
0 |
karlhildekruger 46 / 31 / 19 Регистрация: 09.05.2022 Сообщений: 259 |
||||
05.06.2022, 22:23 [ТС] |
3 |
|||
Это правильно?
Выдает ошибку Код Серьезность Код Описание Проект Файл Строка Состояние подавления Ошибка C2679 бинарный "<<": не найден оператор, принимающий правый операнд типа "const _Ty" (или приемлемое преобразование отсутствует)
0 |
17427 / 9259 / 2264 Регистрация: 30.01.2014 Сообщений: 16,215 |
|
05.06.2022, 23:25 |
4 |
Это правильно? Правильно. И для Student тоже должен быть такой оператор.
Выдает ошибку В какой строке?
0 |
46 / 31 / 19 Регистрация: 09.05.2022 Сообщений: 259 |
|
05.06.2022, 23:35 [ТС] |
5 |
os << vect[i] << «t»; Ошибка в этой строке
0 |
17427 / 9259 / 2264 Регистрация: 30.01.2014 Сообщений: 16,215 |
|
05.06.2022, 23:59 |
6 |
Ошибка в этой строке …
для Student тоже должен быть такой оператор
0 |
karlhildekruger 46 / 31 / 19 Регистрация: 09.05.2022 Сообщений: 259 |
||||
06.06.2022, 00:12 [ТС] |
7 |
|||
Не работает. Выводит те же ошибки
0 |
17427 / 9259 / 2264 Регистрация: 30.01.2014 Сообщений: 16,215 |
|
06.06.2022, 00:13 |
8 |
Не работает. Значит вы что-то не так сделали.
0 |
karlhildekruger 46 / 31 / 19 Регистрация: 09.05.2022 Сообщений: 259 |
||||||||||||
06.06.2022, 00:16 [ТС] |
9 |
|||||||||||
Student.h
institute.h
serializer.h
0 |
2341 / 1868 / 606 Регистрация: 29.06.2020 Сообщений: 7,056 |
|
06.06.2022, 00:32 |
10 |
os << s.getStudentNo(); Эти методы у класса Student, не константные, а вы пытаетесь их вызвать от константного объекта. Добавлено через 2 минуты
string StudentNo = «123»; Улыбнуло )
0 |
DrOffset 17427 / 9259 / 2264 Регистрация: 30.01.2014 Сообщений: 16,215 |
||||
06.06.2022, 00:40 |
11 |
|||
Выводит те же ошибки Ну, как минимум не те же.
Также у вас в реализации оператора << для Student используется константная ссылка (что правильно), но функции используемые внутри него
0 |
46 / 31 / 19 Регистрация: 09.05.2022 Сообщений: 259 |
|
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 |
Вездепух 10932 / 5922 / 1621 Регистрация: 18.10.2014 Сообщений: 14,885 |
|
06.06.2022, 02:04 |
13 |
появились другие ошибки Ну так в ошибке же написано, в чем проблема. Скорее всего вы засунули определение оператора В заголовочный файл можно помещать только определения особых категорий 1. Определения шаблонов Ваш оператор
0 |
alecss131 Модератор 2442 / 1003 / 346 Регистрация: 11.08.2017 Сообщений: 3,093 |
||||||||
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.1k13 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
The problem occurs in Visual Studio 2005 but works in Vc++6.0
rx_fastset.h
struct SortedAppender
{
typedef Std:: output_iterator_tag iterator_category;
typedef BASE value_type;
typedef ptrdiff_t difference_type;
typedef BASE* pointer;
typedef BASE& reference;
sortedAppender(FastSet& fastSet): m_fastSet(fastSet) {}
sortedAppender& operator=(value_type v) { m_fastSet.sortedAppend(v); return *this;}
sortedAppender& operator*() { return *this; }
sortedAppender& operator++() { return *this; }
sortedAppender& operator++(int) { return *this; }
FastSet& m_fastSet;
};
rx_vist.cpp
inline
void SetUnion(const NodeIdSet& leftSet, const NodeIdSet& rightSet, NodeIdSet& unionSet)
{
assert(unionSet.empty());
std:: set_union(leftSet.begin(), leftSet.end(),
rightSet.begin(), rightSet.end(),
NodeIdSet:: sortedAppender(unionSet));
}
I am getting the following errors..
rx_vist.cpp
c:program filesmicrosoft visual studio 8vcincludealgorithm(3815) : error C2679: binary ‘=’ : no operator found which takes a right-hand operand of type ‘RX:: FastSet<BASE>:: sortedAppender’ (or there is no acceptable conversion)
with
[
BASE=RX::NodeId
]
c:arx_fastset.h(63): could be ‘RX::FastSet<BASE>:: sortedAppender &RX:: FastSet<BASE>:: sortedAppender:: operator =(unsigned int)’
with
[
BASE=RX::NodeId
]
while trying to match the argument list ‘(RX::FastSet<BASE>:: sortedAppender, RX::FastSet<BASE>:: sortedAppender)’
with
[
BASE=RX::NodeId
]
c:program filesmicrosoft visual studio 8vcincludealgorithm(3850) : see reference to function template instantiation ‘_OutIt std:: _Set_union<std:: _Vector_const_iterator<_Ty,_Alloc>,std::_Vector_const_iterator<_Ty,_Alloc>,_OutIt>(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt,std::_Range_checked_iterator_tag)’ being compiled
with
[
_OutIt=RX::FastSet<RX::NodeId>:: sortedAppender,
_Ty=RX::NodeId,
_Alloc=std::allocator<RX::NodeId>,
_InIt1=std::_Vector_const_iterator<RX::NodeId,std::allocator<RX::NodeId>>,
_InIt2=std::_Vector_const_iterator<RX::NodeId,std::allocator<RX::NodeId>>
]
c:arx_vist.cpp(77) : see reference to function template instantiation ‘RX::FastSet<BASE>:: sortedAppender std:et_union<std::_Vector_const_iterator<_Ty,_Alloc>,std::_Vector_const_iterator<_Ty,_Alloc>,RX::FastSet<BASE>:: sortedAppender>(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt)’ being compiled
with
[
BASE=RX::NodeId,
_Ty=RX::NodeId,
_Alloc=std::allocator<RX::NodeId>,
_InIt1=std::_Vector_const_iterator<RX::NodeId,std::allocator<RX::NodeId>>,
_InIt2=std::_Vector_const_iterator<RX::NodeId,std::allocator<RX::NodeId>>,
_OutIt=RX::FastSet<RX::NodeId>:: sortedAppender
]
c:program filesmicrosoft visual studio 8vcincludealgorithm(3815) : error C2582: ‘operator =’ function is unavailable in ‘RX::FastSet<BASE>:: sortedAppender’
with
[
BASE=RX::NodeId
]
Any help in this would be grateful.