Ошибка c2676 c

I’m trying to write code in C++ (using template) to add between 2 matrices.

I have the following code in .h file.

#ifndef __MATRIX_H__
#define __MATRIX_H__

//***************************
//         matrix
//***************************

template <class T, int rows, int cols> class matrix {
public:
    T mat[rows][cols];
    matrix();
    matrix(T _mat[rows][cols]);
    matrix operator+(const matrix& b);
};

template <class T, int rows, int cols> matrix <T,rows,cols> :: matrix (T _mat[rows][cols]){
    for (int i=0; i<rows; i++){
        for (int j=0; j<cols; j++){
            mat[i][j] = _mat[i][j];
        }
    }
}

template <class T, int rows, int cols> matrix <T,rows,cols> :: matrix (){
    for (int i=0; i<rows; i++){
        for (int j=0; j<cols; j++){
            mat[i][j] = 0;
        }
    }
}

template <class T, int rows, int cols> matrix <T,rows,cols> matrix <T,rows,cols>::operator+(const matrix<T, rows, cols>& b){
    matrix<T, rows, cols> tmp;
    for (int i=0; i<rows; i++){
        for (int j=0; j<cols; j++){
            tmp[i][j] = this->mat[i][j] + b.mat[i][j];
        }
    }
    return tmp;
}



#endif

my .cpp :

#include "tar5_matrix.h"
int main(){

    int mat1[2][2] = {1,2,3,4};
    int mat2[2][2] = {5,6,7,8};
    matrix<int, 2, 2> C;
    matrix<int, 2, 2> A = mat1;
    matrix<int, 2, 2> B = mat2;
    C = A+B;
    return 0;
}

When compiling, I get the following error:

1>c:\users\karin\desktop\lior\study\cpp\cpp_project\cpp_project\tar5_matrix.h(36):
error C2676: binary ‘[‘ : ‘matrix’ does not define this
operator or a conversion to a type acceptable to the predefined
operator

Please advise

A1lexen

0 / 0 / 0

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

Сообщений: 30

1

20.08.2017, 17:19. Показов 8533. Ответов 8

Метки итераторы, классы (Все метки)


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

Учу C++ по книге, в конце главы есть задание: написать функцию подсчета символов к классу Document.
Не работает переход по итераторам. Не могу понять в чем проблема.

document.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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <list>
#include <vector>
#include <iostream>
using namespace std;
 
using Line = vector<char>;
 
class Text_iterator {
    list<Line>::iterator ln;
    Line::iterator pos;
 
public:
    Text_iterator(list<Line>::iterator ll, Line::iterator pp) : ln{ ll }, pos{ pp } {}
    char& operator* () { return *pos; }
 
    Text_iterator& operator++ ();
 
    bool operator== (const Text_iterator& other) const { return ln == other.ln && pos == other.pos; }
    bool operator!= (const Text_iterator& other) const { return !(*this == other); }
};
 
struct Document {
    list<Line> line;
    Document() { line.push_back(Line{}); }
 
    Text_iterator begin() { return Text_iterator(line.begin(), line.begin()->begin()); }
    Text_iterator end() { return Text_iterator(line.end(), line.end()->end()); }
 
    int count();
};
 
istream& operator>> (istream& is, Document& d) {
    for (char ch; is.get(ch);) {
        d.line.back().push_back(ch);
        if (ch == '\n') d.line.push_back(Line{});
            
    }
    
    if (d.line.back().size()) d.line.push_back(Line{});
 
    return is;
}

document.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "document.h"
 
Text_iterator& Text_iterator::operator++ () {
    pos++;
    if (pos == ln->end()) {
        ln++;
        pos == ln->begin();
    }
 
    return *this;
}
 
int Document::count() {
    int count = 0;
    Text_iterator q = begin();
    while (q != end()) {
        count++;
        q++;
    }
    return count;
}



0



igdev

79 / 67 / 28

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

Сообщений: 384

20.08.2017, 22:08

2

A1lexen,

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

Не работает переход по итераторам. Не могу понять в чем проблема.

Проблема в том, что вы написали только определение инкремента/декремента.

C++
1
Text_iterator& operator++ ();

Для данного перегруженного оператора нужно писать еще и определение.



0



0 / 0 / 0

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

Сообщений: 30

20.08.2017, 22:10

 [ТС]

3

Я написал определение в другом файле, код из которого вставил внизу. Разве для перегрузки операторов определение должно быть сразу после объявления?



0



igdev

79 / 67 / 28

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

Сообщений: 384

20.08.2017, 22:26

4

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

Я написал определение в другом файле, код из которого вставил внизу. Разве для перегрузки операторов определение должно быть сразу после объявления?

Извините, сразу не заметил. Нет, не нужно.

Добавлено через 7 минут
Для чего нужна эта строка?

C++
1
pos == ln->begin();

Так и должно быть?



0



A1lexen

0 / 0 / 0

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

Сообщений: 30

20.08.2017, 23:01

 [ТС]

5

Каждая строка — вектор символов,

C++
1
pos == ln->begin();

переводит итератор на первый символ строки



0



notAll

495 / 209 / 70

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

Сообщений: 557

20.08.2017, 23:25

6

C++
1
2
3
4
5
while (q != end())
    {
        count++;
        ++q;
    }



0



igdev

79 / 67 / 28

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

Сообщений: 384

21.08.2017, 00:25

7

A1lexen, Тогда, наверное, должно быть так:

C++
1
pos = ln->begin();



0



0 / 0 / 0

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

Сообщений: 30

21.08.2017, 12:08

 [ТС]

8

Точно, не заметил, что случайно поставил оператор ровно, вместо присваивания.

Добавлено через 3 минуты
С префиксной формой появляется другая ошибки



0



79 / 67 / 28

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

Сообщений: 384

21.08.2017, 16:17

9

A1lexen, Какие именно ошибки?



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

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

21.08.2017, 16:17

Помогаю со студенческими работами здесь

Ошибка C2676 бинарный «[«: «matr» не определяет этот оператор
Компилятор возмущается:(
Выдает ошибки:
отсутствует оператор &quot;&quot;, соответствующий этим операндам…

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

#include &quot;stdafx.h&quot;

#include &lt;iostream&gt;
#include…

C2678 бинарный «>>»: не найден оператор, принимающий левый операнд типа «std::ostream»
Код:
#include &lt;iostream&gt;
#include &lt;memory&gt;
#include &lt;typeinfo&gt;
#include &lt;ctime&gt;
#include…

Error C2678: бинарный «<<«: не найден оператор, принимающий левый операнд типа «std::ifstream»
Собственно, текст ошибки приведен в названии темы. Сам код:
#include &quot;stdafx.h&quot;
#include…

Error C2678: бинарный «>>»: не найден оператор, принимающий левый операнд типа «std::istream»
Вот ошибка
1&gt;—— Построение начато: проект: ыпошряоям, Конфигурация: Debug Win32 ——
1&gt; …

Error C2678: бинарный «<«: не найден оператор, принимающий левый операнд типа «System::Decimal»
Делал программу для расчета exp, с точностью до eps = 0.1, …, 0.000001 путем разложения функции в…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

9

I have a custom List class and I want to write a method to sort items in this List. For example:

void ListAlgoritms<T>::Sort(List<T>& list)
{
    T temp;

    for (int i = 0; i < list.GetSize() - 1; i++)
    {
        if (list[i] > list[i + 1])
        {
            list.Swap(i, i + 1);
        }

        i--;
    }
}

Overloading of square brackets in List:

template<typename T>
const T & List<T>::operator[](int index)
{
    if (index < this->_size || index >= this->_size)
    {
        throw new std::exception("Out of array border");
    }

    ListNode<T> *cur = this->_head;
    int counter = 0;

    while (cur != nullptr)
    {
        if (counter == index)
        {
            return cur->data;
        }

        cur = cur->next;
        counter++;
    }

    return NULL;
}

To comapre two objects in Sort method I overload ‘>’ and ‘<‘ in the classes that I want to add to the List. For example:

bool Coach::operator >(const Coach & obj) const
{
    return strlen(this->_vehicleInfo._vechicleName) > strlen(obj._vehicleInfo._vechicleName);
}

bool Coach::operator <(const Coach & obj) const
{
    return strlen(this->_vehicleInfo._vechicleName) < strlen(obj._vehicleInfo._vechicleName);
}

But when I try to compile the project, I have this error:

C2676. Binary '>': 'const T' does not define this operator or a conversion to a type acceptable to the predefined operator.

But it’s works good with overloading >> and << operators (input/output operators)

   class Coach : public PassengerVehicle
{
public:
    Coach(double fuelConsumption = 0, int maxNumberOfPersons = 0, double ticketCost = 0, const char* name = new char[10]{ "undefine" }, int countOfSections = 0);
    ~Coach();

    Coach(const Coach &coach);

public:
    void Move(double) override;
    double GetProfit() override;
    int GetCountOfSections();
    void SetCountOfSections(int count); 

    void SetHeader();
    void SetData(texttable::TextTable& t);
    Coach& operator = (Coach& obj);
    bool operator > (const Coach& obj) const;
    bool operator < (const Coach& obj) const;
    friend std::ostream & operator << (std::ostream &out, Coach& vehicle);
    friend std::istream & operator >> (std::istream &in, Coach& vehicle);

private:
    int CountOfSections;

};

/////////////////////////////

       T inputData;
    ...
std::cin >> inputData;

#c #list #struct #compiler-errors

#c #Список #структура #ошибки компилятора

Вопрос:

Я пытаюсь проверить, есть ли уже элемент с таким же значением внутри списка структур, поэтому, если его нет, я возвращаю в список новую структуру.Рассматривайте это как систему с учетными записями, и если учетная запись уже есть, я не хочу снова добавлять ее в список.

Вот мой код в основном:

 accounts test;
test.bal = 0;
test.id = 0;
std::list <accounts> accs;
std::list<accounts>::iterator check;
 

Вот мой код за пределами main:

 #include <list>
#include <iterator>
#include <algorithm>
struct accounts {
    long id;
    int bal;

};
 

Вот мой код внутри цикла for:

  check = find(accs.begin(), accs.end(), test.id);
        if (check == accs.end()) {
            accs.push_back(test);
        }
 

Когда я запускаю код, я получаю ошибку компилятора :

Ошибка C2676 двоичный файл ‘==’: ‘accounts’ не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора bankacc C:Program Файлы (x86)Microsoft Visual Studio2019 Сообщество VCИнструменты MSVC14.28.29333 включить xutility 5440

Я видел другие потоки, и я думаю, что мне нужно сделать

 if(check == accs.id.end())
 

или что-то в этом роде, но это не работает, отображается ошибка:

Ошибка (активная) E0135 класс «std::list<учетные записи, std::распределитель>» не имеет члена «id»

Есть идеи? 🙂

Комментарии:

1. Я думаю, мне нужно сделать как-то не угадать, компилятор показывает вам точную строку.

2. @S.M. позвольте мне улучшить мой вопрос

3. if(check == accs.id.end()) неверно или является решением.

4. Становится очень запутанным читать код, который использует существительные во множественном числе для единственных вещей. Если тип представляет учетную запись, назовите его «учетная запись», а не «учетные записи».

5. @molbdnilo когда я удаляю часть внутри цикла for, код работает, и да, мне жаль, что вы правы насчет имен переменных, я забыл их изменить

Ответ №1:

std::find принимает объект того же типа, что и типы в вашем контейнере, которые вы хотите найти, в качестве последнего аргумента. В вашем случае вам следует использовать std::find_if вместо:

 check = find_if(accs.begin(), accs.end(),
    [amp;test](const autoamp; ac) {
      return ac.id == test.id;
    });
 

Комментарии:

1. большое вам спасибо, что сработало. Не могли бы вы объяснить, что на самом деле сделано здесь после [amp;test] ? (На самом деле это сработало, но не подтолкнуло структуру) @johnmastroberti

2. В коде используется лямбда-выражение: https://en.cppreference.com/w/cpp/language/lambda

3. Последний аргумент также find_if является функцией, которая должна возвращаться true при выполнении условия, которое вы хотите найти. Я добился этого здесь с помощью лямбда (бит от [amp;test] до конечной фигурной скобки). Подробнее об этом можно прочитать здесь . Код, который я опубликовал, только заменяет ваш вызов find . Вам все еще нужны последние три строки, которые у вас были, где вы возвращаете новую учетную запись, если она не была найдена.

4. @johnmastroberti ооо, хорошо, большое тебе спасибо. Я полагаю, что обычно для accs размер = 4456540? Потому что я поставил его на просмотр, и это тот размер, который он мне дает

5. Я думаю, вам, вероятно, следует задать отдельный вопрос об этом.

Ответ №2:

Причина довольно проста. Когда вы используете std::find , под капотом происходит что-то вроде этого,

 for(iterator i = begin; i != end; i  )
    if(*i == check) return i;
 

Глядя на это, вы можете видеть, что когда мы передаем ваш список, тип итератора — это std::list<accounts>::iterator то, против чего вы проверяете accounts::id . Способа сделать это нет.

Итак, какие есть варианты? У вас есть 3,

  1. Создайте == оператор для accounts структуры.
  2. Просто перейдите test к тестированию.
  3. Передайте функцию для выполнения сравнения.

Первый простой, вы можете скопировать и вставить это, если хотите,

 struct accounts {
    long id;
    int bal;
    
    bool operator==(const longamp; otherID) const { return id == otherID; }
};
 

Теперь, когда std::find вызывается == оператор, он знает, что делать.

Третий простой, используйте лямбда-выражение.

 check = find(accs.begin(), accs.end(), [amp;test](const accountsamp; other) {
      return other.id == test.id; });
if (check == accs.end()) {
    accs.push_back(test);
}
 

Комментарии:

1. Значит, оба списка должны быть итераторами?

2. Извините, я по ошибке опубликовал неправильный ответ (наполовину завершен). Я отредактировал его.

3. Для первой ошибки Error C2679 binary '==': no operator found which takes a right-hand operand of type 'const _Ty' (or there is no acceptable conversion) bankacc C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.28.29333includexutility 5440 и для 3-й она выдает ту же ошибку, что и раньше

4. @TheCodingGuy я ввел const accountsamp; там, где это должно быть const longamp; . Извините, я исправил это.

5. Спасибо, что исправлена ошибка, но по какой-то причине структура не нажимается и получает числа, которые она не должна, вероятно, это моя ошибка где-то спасибо, хотя

Ответ №3:

Просто перегрузите оператор «==». В параметрах выберите желаемый тип значения, которое вы хотите.

I’m trying to write code in C++ (using template) to add between 2 matrices.

I have the following code in .h file.

#ifndef __MATRIX_H__
#define __MATRIX_H__

//***************************
//         matrix
//***************************

template <class T, int rows, int cols> class matrix {
public:
    T mat[rows][cols];
    matrix();
    matrix(T _mat[rows][cols]);
    matrix operator+(const matrix& b);
};

template <class T, int rows, int cols> matrix <T,rows,cols> :: matrix (T _mat[rows][cols]){
    for (int i=0; i<rows; i++){
        for (int j=0; j<cols; j++){
            mat[i][j] = _mat[i][j];
        }
    }
}

template <class T, int rows, int cols> matrix <T,rows,cols> :: matrix (){
    for (int i=0; i<rows; i++){
        for (int j=0; j<cols; j++){
            mat[i][j] = 0;
        }
    }
}

template <class T, int rows, int cols> matrix <T,rows,cols> matrix <T,rows,cols>::operator+(const matrix<T, rows, cols>& b){
    matrix<T, rows, cols> tmp;
    for (int i=0; i<rows; i++){
        for (int j=0; j<cols; j++){
            tmp[i][j] = this->mat[i][j] + b.mat[i][j];
        }
    }
    return tmp;
}



#endif

my .cpp :

#include "tar5_matrix.h"
int main(){

    int mat1[2][2] = {1,2,3,4};
    int mat2[2][2] = {5,6,7,8};
    matrix<int, 2, 2> C;
    matrix<int, 2, 2> A = mat1;
    matrix<int, 2, 2> B = mat2;
    C = A+B;
    return 0;
}

When compiling, I get the following error:

1>c:\users\karin\desktop\lior\study\cpp\cpp_project\cpp_project\tar5_matrix.h(36):
error C2676: binary ‘[‘ : ‘matrix’ does not define this
operator or a conversion to a type acceptable to the predefined
operator

Please advise

Понравилась статья? Поделить с друзьями:
  • Ошибка c2589 недопустимая лексема справа от
  • Ошибка c2371 переопределение различные базовые типы
  • Ошибка c2318 toyota prius 20
  • Ошибка c2300 приус 30
  • Ошибка c2280 предпринята попытка ссылки на удаленную функцию