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:
document.cpp:
0 |
igdev 79 / 67 / 28 Регистрация: 22.04.2016 Сообщений: 384 |
||||
20.08.2017, 22:08 |
2 |
|||
A1lexen,
Не работает переход по итераторам. Не могу понять в чем проблема. Проблема в том, что вы написали только определение инкремента/декремента.
Для данного перегруженного оператора нужно писать еще и определение.
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 |
|||
Я написал определение в другом файле, код из которого вставил внизу. Разве для перегрузки операторов определение должно быть сразу после объявления? Извините, сразу не заметил. Нет, не нужно. Добавлено через 7 минут
Так и должно быть?
0 |
A1lexen 0 / 0 / 0 Регистрация: 14.07.2016 Сообщений: 30 |
||||
20.08.2017, 23:01 [ТС] |
5 |
|||
Каждая строка — вектор символов,
переводит итератор на первый символ строки
0 |
notAll 495 / 209 / 70 Регистрация: 27.05.2016 Сообщений: 557 |
||||
20.08.2017, 23:25 |
6 |
|||
0 |
igdev 79 / 67 / 28 Регистрация: 22.04.2016 Сообщений: 384 |
||||
21.08.2017, 00:25 |
7 |
|||
A1lexen, Тогда, наверное, должно быть так:
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» не определяет этот оператор Error C2679: бинарный «<<«: не найден оператор, принимающий правый операнд типа «std::string» (или приемлемое #include "stdafx.h" #include <iostream> C2678 бинарный «>>»: не найден оператор, принимающий левый операнд типа «std::ostream» Error C2678: бинарный «<<«: не найден оператор, принимающий левый операнд типа «std::ifstream» Error C2678: бинарный «>>»: не найден оператор, принимающий левый операнд типа «std::istream» Error C2678: бинарный «<«: не найден оператор, принимающий левый операнд типа «System::Decimal» Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 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,
- Создайте
==
оператор дляaccounts
структуры. - Просто перейдите
test
к тестированию. - Передайте функцию для выполнения сравнения.
Первый простой, вы можете скопировать и вставить это, если хотите,
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