Given the following code;
#include<iostream>
using namespace std;
int main(){
int number_1 = 3;
int result_1 = 10;
result_1 += number_1;
cout << ++result_1;
cout << result_1 += number_1;
}
The line cout << result_1 += number_1;
giving me an error.
no match for ‘operator+=’ (operand types are ‘std::basic_ostream’ and ‘int’)
On the other hand, the cout << ++result_1;
is running without any problems.
Can anyone please explain what is the error is for, what the cause is?
songyuanyao
168k16 gold badges305 silver badges400 bronze badges
asked Jul 27, 2016 at 10:49
2
- Can anyone please explain what is the error is for, what the cause is?
According to Operator Precedence, operator<<
has higher precedence than operator+=
, so your code is equivalent as:
(cout << result_1) += number_1;
while cout << result_1
will return std::cout
(i.e. std::ostream&
) and then operator+=
is attempted to be called on std::ostream
and it doesn’t exist. That’s what the error message trying to tell you.
You could change it to:
cout << (result_1 += number_1) ;
or avoid such kind of confusing code fundamentally.
result_1 += number_1;
cout << result_1;
- On the other hand
cout << ++result_1;
is running with out any problem.
Beasuse operator++
has higher precedence than operator<<
. So it’s equivalent as cout << (++result_1);
and would be fine.
answered Jul 27, 2016 at 10:53
songyuanyaosongyuanyao
168k16 gold badges305 silver badges400 bronze badges
1
If you take a look at the operator precedence rules, you’ll find that the statement is equivalent to
(cout << result_1) += number_1 ;
The operator<<
returns the std::cout
. And there exists no std::ostream::operator+=(int)
.
Solution: Use parenthesis to express the intended order of operations.
On the other hand cout << ++result_1; is running with out any problem
As one would expect. Study the precedence of operators.
answered Jul 27, 2016 at 10:53
eerorikaeerorika
231k12 gold badges195 silver badges321 bronze badges
Read you commpiler error carefully. Everything is there .
The reason for error is operator precedence.
Compiler first executes cout << result_1
.
Then, it tries to execute something like this: cout += number_1
.
Does it have any sense?
To do what you intended change your line:
cout << (result_1 += number_1);
I strongly recommend reading this:
http://en.cppreference.com/w/cpp/language/operator_precedence
answered Jul 27, 2016 at 10:54
LehuLehu
7514 silver badges14 bronze badges
Operator precedence.
The call is semantically equivalent to something like cout << result_1; cout += result;
— which is invalid.
Adding parentheses to the code (allowing the +=
computed before the <<
) as follows allows the code to compile;
cout << (result_1 += number_1);
On the error itself; the compiler cannot find an implementation of the operator +=
for the arguments provided — there isn’t a standard one. This is because the cout << result_1
is evaluated before the operator +=
. From the above, this makes sense, but doesn’t immediately indicate where the potential fix can be applied.
answered Jul 27, 2016 at 10:53
NiallNiall
29.8k10 gold badges97 silver badges141 bronze badges
- Forum
- Beginners
- no match for operator>>
no match for operator>>
Hi, so I’m a total beginner and am having trouble trying to overload the insertion operator. When I try it tells me «error: no match for ‘operator>>’ (operand types are ‘std::istream’ {aka ‘std::basic_istream’} and ‘int’)»
Here is the header:
|
|
And this is the implementation file:
|
|
I assume that I have a type mismatch, but I guess I’m a little thick, because I don’t see it.
What do YOU think line 11 is doing in the 2nd one?
How big do you think that A array is?
you cannot cin an array. you have to loop and read one by one.
and C style arrays need a fixed size at compile time; the only way around this is a pointer of some sort (whether done for you or not).
edit, misread what you did, the >> is fine apart from trying to read and write an array.
Last edited on
There are three main issues with your code.
The first issue is that your array a is not specified as having any size. The size of arrays, whether in a class or not, must be known at compile time.
The second issue is second snippet, line 9: myArray::istream& is not a type. You meant to just write istream&.
The third issue is second snippet, line 11: You are calling >> on an array (a). Presumably you meant to call something more like:
|
|
You should also be thinking about bounds checking, e.g. (if arrayLen == maxSize) { don’t add to array }. This is assuming you have some notion of «MaxSize» (see first issue).
|
|
Last edited on
So does that mean that I could do this:
|
|
|
|
Wait, no, that still doesn’t work… Okay, I still seem to be misunderstanding something.
What does «not work» mean?
The same error comes up about «no match for ‘operator>>’ (operand types are ‘std::istream’ {aka ‘std::basic_istream’} and ‘int’)»
Perhaps something like:
|
|
person5273, your code that you have shown does not have problems, assuming it’s being successfully compiled/linked by however you are building it. I was able to copy and paste it into cpp.sh as one file and compile it (after removing the #include «myArray.h»), after adding a main function. So the problem exists in part of the code you are not showing.
The array size is specified at compile time.
Topic archived. No new replies allowed.
Ошибка на c=a-b;
Проблема с типами походу.
[Error] no match for ‘operator=’ (operand types are ‘massiv’ and ‘massiv’)
Не могу понять что он от меня хочет) Как исправить, подскажите добрые люди?
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <iostream>
#pragma hdrstop
using namespace std;
class massiv
{
private:
int mas[5];
int size=5;
public:
massiv()
{
for(int i=0;i<size;i++)
mas[i]=0;
}
massiv(int len)
{
if (len<1 || len>10) size=5;
else size=len;
for(int i=0;i<size;i++)
mas[i]=0;
}
massiv(massiv & w)
{
size=w.size;
for(int i=0;i<size;i++)
mas[i]=w.mas[i];
}
~massiv()
{
}
void vvod()
{
cout<<"vvedite massiv"<<endl;
for(int i=0; i<size; i++)
{
cout<<i+1<<"= ";
cin>>mas[i];
}
}
void print()
{
for(int i=0; i<size;i++){
cout<<mas[i]<<" ";
}
cout << endl;
}
massiv operator-(massiv &w)
{
int temp;
massiv c;
if (size>w.size)
temp=size;
else
temp=w.size;
c.size=temp;
for(int i=0;i<temp;i++)
{
if(i<size && i<w.size)
{
c.mas[i]=mas[i]-w.mas[i];
}
if(i<size && i>=w.size)
{
c.mas[i]=mas[i];
}
if(i>=size && i<w.size)
{
c.mas[i]=-w.mas[i];
}
}
return c;
}
massiv operator=(massiv &w)
{
for(int i=0;i<size;i++)
mas[i]=w.mas[i];
return *this;
}
};
int main()
{
massiv a,b,c;
a.vvod();
b.vvod();
cout<<endl;
a.print();
b.print();
cout<<endl;
c=a-b;<
a.print();
cout<<"-"<<endl;
b.print();
cout<<"="<<endl;
c.print();
return 0;
}
I’m getting a different error now.
In file included from toml11/toml/types.hpp:8:0,
from toml11/toml/parser.hpp:9,
from toml11/toml.hpp:36,
from toml-test.cpp:1:
toml11/toml/comments.hpp: In member function ‘toml::preserve_comments::iterator toml::preserve_comments::insert(toml::preserve_comments::const_iterator, const string&)’:
toml11/toml/comments.hpp:86:36: error: no matching function for call to ‘std::vector<std::basic_string<char> >::insert(toml::preserve_comments::const_iterator&, const string&)’
return comments.insert(p, x);
xKore_Nano_Man 1 / 1 / 0 Регистрация: 30.12.2017 Сообщений: 101 |
||||
1 |
||||
31.12.2017, 21:59. Показов 14079. Ответов 4 Метки нет (Все метки)
Имеем следующий код:
При попытки запустить его у меня вылазит ошибка вот в этой строке: if(number < old); сама ошибка выглядит следующим образом: no match for ‘operator<‘ (operand types are ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ and ‘int’)|. Буду рад вашей помощи!) С наступающим)
0 |
Заблокирован |
|
31.12.2017, 22:23 |
2 |
РешениеxKore_Nano_Man, наверно надо строку
string number; при сравнении c ‘int old’ преобразовать в ‘int’?
1 |
1 / 1 / 0 Регистрация: 30.12.2017 Сообщений: 101 |
|
31.12.2017, 22:33 [ТС] |
3 |
Спасибо большое, переменную number нужно преобразовать в int…!!!!
0 |
зомбяк 1581 / 1215 / 345 Регистрация: 14.05.2017 Сообщений: 3,939 |
|
31.12.2017, 22:56 |
4 |
string number; int number;
0 |
1 / 1 / 0 Регистрация: 30.12.2017 Сообщений: 101 |
|
02.01.2018, 17:04 [ТС] |
5 |
Я знаю)
0 |