I have read other responses to similar problems but nothing has worked. Those responses suggest including #include <string>
, but that didn't work. Also, I tried making the overloads friend
functions in the User
class, but that didn't work.
This is the User
class:
class User
{
bool status;
std::string first_name;
std::string last_name;
public:
static int user_count;
User()
{
status = 0;
first_name = "first";
last_name = "last";
user_count++;
}
User(std::string new_first, std::string new_last, bool new_status)
{
first_name = new_first;
last_name = new_last;
status = new_status;
user_count++;
}
//Some getters and setters...
~User()
{
user_count--;
}
friend std::ostream& operator <<(std::ostream&, User&);
friend std::istream& operator >>(std::istream&, User&);
};
And yes, I initialized the user_count
outside of the class.
These are the overloads:
std::ostream& operator <<(std::ostream& output, User& user)
{
output << "First name: " << user.first_name << "\nLast name: " << user.last_name;
return output;
}
std::istream& operator >>(std::istream& input, User& user)
{
input >> user.first_name >> user.last_name >> user.status;
return input;
}
This is the main()
function:
int main()
{
User user();
std::cin >> user;
std::cout << user << std::endl;
return EXIT_SUCCESS;
}
The headers are:
#include <iostream>
#include <string>
EDIT: I did not explain myself very well. I was following a tutorial on YouTube about operator overloading, and I was copying exactly what the guy in the video was doing, the overload on <<
was working fine, but when trying to do so on >>
I got this huge error:
main.cpp: In function ‘int main()’: main.cpp:75:14: error: no match for ‘operator>>’ (operand types are ‘std::istream’ {aka ‘std::basic_istream<char>’} and ‘User(’) 75 | std::cin >> user; | ~~~~~~~~ ^~ ~~~~ | | | | | User() | std::istream {aka std::basic_istream<char>} In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:120:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__istream_type& (*)(std::basic_istream<_CharT, _Traits>::__istream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>]’ <near match> 120 | operator>>(__istream_type& (*__pf)(__istream_type&)) | ^~~~~~~~ /usr/include/c++/9/istream:120:7: note: conversion of argument 1 would be ill-formed: main.cpp:75:17: error: invalid conversion from ‘User (*)()’ to ‘std::basic_istream<char>::__istream_type& (*)(std::basic_istream<char>::__istream_type&)’ {aka ‘std::basic_istream<char>& (*)(std::basic_istream<char>&)’} [-fpermissive] 75 | std::cin >> user; | ^~~~ | | | User (*)() In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:124:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__ios_type& (*)(std::basic_istream<_CharT, _Traits>::__ios_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>; std::basic_istream<_CharT, _Traits>::__ios_type = std::basic_ios<char>]’ <near match> 124 | operator>>(__ios_type& (*__pf)(__ios_type&)) | ^~~~~~~~ /usr/include/c++/9/istream:124:7: note: conversion of argument 1 would be ill-formed: main.cpp:75:17: error: invalid conversion from ‘User (*)()’ to ‘std::basic_istream<char>::__ios_type& (*)(std::basic_istream<char>::__ios_type&)’ {aka ‘std::basic_ios<char>& (*)(std::basic_ios<char>&)’} [-fpermissive] 75 | std::cin >> user; | ^~~~ | | | User (*)() In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:131:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::ios_base& (*)(std::ios_base&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>]’ <near match> 131 | operator>>(ios_base& (*__pf)(ios_base&)) | ^~~~~~~~ /usr/include/c++/9/istream:131:7: note: conversion of argument 1 would be ill-formed: main.cpp:75:17: error: invalid conversion from ‘User (*)()’ to ‘std::ios_base& (*)(std::ios_base&)’ [-fpermissive] 75 | std::cin >> user; | ^~~~ | | | User (*)() In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:168:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(bool&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>]’ <near match> 168 | operator>>(bool& __n) | ^~~~~~~~ /usr/include/c++/9/istream:168:7: note: conversion of argument 1 would be ill-formed: main.cpp:75:17: error: cannot bind non-const lvalue reference of type ‘bool&’ to an rvalue of type ‘bool’ 75 | std::cin >> user; | ^~~~ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:172:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short int&) [with _CharT = char; _Traits = std::char_traits<char>]’ <near match> 172 | operator>>(short& __n); | ^~~~~~~~ /usr/include/c++/9/istream:172:7: note: conversion of argument 1 would be ill-formed: main.cpp:75:17: error: invalid conversion from ‘User (*)()’ to ‘short int’ [-fpermissive] 75 | std::cin >> user; | ^~~~ | | | User (*)() main.cpp:75:17: error: cannot bind rvalue ‘(short int)user’ to ‘short int&’ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:175:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(short unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>]’ <near match> 175 | operator>>(unsigned short& __n) | ^~~~~~~~ /usr/include/c++/9/istream:175:7: note: conversion of argument 1 would be ill-formed: main.cpp:75:17: error: invalid conversion from ‘User (*)()’ to ‘short unsigned int’ [-fpermissive] 75 | std::cin >> user; | ^~~~ | | | User (*)() main.cpp:75:17: error: cannot bind rvalue ‘(short unsigned int)user’ to ‘short unsigned int&’ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:179:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(int&) [with _CharT = char; _Traits = std::char_traits<char>]’ <near match> 179 | operator>>(int& __n); | ^~~~~~~~ /usr/include/c++/9/istream:179:7: note: conversion of argument 1 would be ill-formed: main.cpp:75:17: error: invalid conversion from ‘User (*)()’ to ‘int’ [-fpermissive] 75 | std::cin >> user; | ^~~~ | | | User (*)() main.cpp:75:17: error: cannot bind rvalue ‘(int)user’ to ‘int&’ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:182:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>]’ <near match> 182 | operator>>(unsigned int& __n) | ^~~~~~~~ /usr/include/c++/9/istream:182:7: note: conversion of argument 1 would be ill-formed: main.cpp:75:17: error: invalid conversion from ‘User (*)()’ to ‘unsigned int’ [-fpermissive] 75 | std::cin >> user; | ^~~~ | | | User (*)() main.cpp:75:17: error: cannot bind rvalue ‘(unsigned int)user’ to ‘unsigned int&’ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:186:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long int&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>]’ <near match> 186 | operator>>(long& __n) | ^~~~~~~~ /usr/include/c++/9/istream:186:7: note: conversion of argument 1 would be ill-formed: main.cpp:75:17: error: invalid conversion from ‘User (*)()’ to ‘long int’ [-fpermissive] 75 | std::cin >> user; | ^~~~ | | | User (*)() main.cpp:75:17: error: cannot bind rvalue ‘(long int)user’ to ‘long int&’ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:190:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>]’ <near match> 190 | operator>>(unsigned long& __n) | ^~~~~~~~ /usr/include/c++/9/istream:190:7: note: conversion of argument 1 would be ill-formed: main.cpp:75:17: error: invalid conversion from ‘User (*)()’ to ‘long unsigned int’ [-fpermissive] 75 | std::cin >> user; | ^~~~ | | | User (*)() main.cpp:75:17: error: cannot bind rvalue ‘(long unsigned int)user’ to ‘long unsigned int&’ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:195:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long long int&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>]’ <near match> 195 | operator>>(long long& __n) | ^~~~~~~~ /usr/include/c++/9/istream:195:7: note: conversion of argument 1 would be ill-formed: main.cpp:75:17: error: invalid conversion from ‘User (*)()’ to ‘long long int’ [-fpermissive] 75 | std::cin >> user; | ^~~~ | | | User (*)() main.cpp:75:17: error: cannot bind rvalue ‘(long long int)user’ to ‘long long int&’ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:199:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long long unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>]’ <near match> 199 | operator>>(unsigned long long& __n) | ^~~~~~~~ /usr/include/c++/9/istream:199:7: note: conversion of argument 1 would be ill-formed: main.cpp:75:17: error: invalid conversion from ‘User (*)()’ to ‘long long unsigned int’ [-fpermissive] 75 | std::cin >> user; | ^~~~ | | | User (*)() main.cpp:75:17: error: cannot bind rvalue ‘(long long unsigned int)user’ to ‘long long unsigned int&’ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:235:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(void*&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>]’ <near match> 235 | operator>>(void*& __p) | ^~~~~~~~ /usr/include/c++/9/istream:235:7: note: conversion of argument 1 would be ill-formed: main.cpp:75:17: error: invalid conversion from ‘User (*)()’ to ‘void*’ [-fpermissive] 75 | std::cin >> user; | ^~~~ | | | User (*)() main.cpp:75:17: error: cannot bind rvalue ‘(void*)user’ to ‘void*&’ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:214:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(float&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>]’ 214 | operator>>(float& __f) | ^~~~~~~~ /usr/include/c++/9/istream:214:25: note: no known conversion for argument 1 from ‘User()’ to ‘float&’ 214 | operator>>(float& __f) | ~~~~~~~^~~ /usr/include/c++/9/istream:218:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(double&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>]’ 218 | operator>>(double& __f) | ^~~~~~~~ /usr/include/c++/9/istream:218:26: note: no known conversion for argument 1 from ‘User()’ to ‘double&’ 218 | operator>>(double& __f) | ~~~~~~~~^~~ /usr/include/c++/9/istream:222:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long double&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>]’ 222 | operator>>(long double& __f) | ^~~~~~~~ /usr/include/c++/9/istream:222:31: note: no known conversion for argument 1 from ‘User()’ to ‘long double&’ 222 | operator>>(long double& __f) | ~~~~~~~~~~~~~^~~ /usr/include/c++/9/istream:259:7: note: candidate: ‘std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__streambuf_type*) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>]’ 259 | operator>>(__streambuf_type* __sb); | ^~~~~~~~ /usr/include/c++/9/istream:259:36: note: no known conversion for argument 1 from ‘User()’ to ‘std::basic_istream<char>::__streambuf_type*’ {aka ‘std::basic_streambuf<char>*’} 259 | operator>>(__streambuf_type* __sb); | ~~~~~~~~~~~~~~~~~~^~~~ main.cpp:65:15: note: candidate: ‘std::istream& operator>>(std::istream&, User&)’ 65 | std::istream& operator >>(std::istream& input, User& user) | ^~~~~~~~ main.cpp:65:54: note: no known conversion for argument 2 from ‘User()’ to ‘User&’ 65 | std::istream& operator >>(std::istream& input, User& user) | ~~~~~~^~~~ In file included from /usr/include/c++/9/string:56, from /usr/include/c++/9/bits/locale_classes.h:40, from /usr/include/c++/9/bits/ios_base.h:41, from /usr/include/c++/9/ios:42, from /usr/include/c++/9/ostream:38, from /usr/include/c++/9/iostream:39, from main.cpp:1: /usr/include/c++/9/bits/basic_string.tcc:1466:5: note: candidate: ‘template<class _CharT, class _Traits, class _Alloc> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&)’ 1466 | operator>>(basic_istream<_CharT, _Traits>& __in, | ^~~~~~~~ /usr/include/c++/9/bits/basic_string.tcc:1466:5: note: template argument deduction/substitution failed: main.cpp:75:17: note: mismatched types ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>’ and ‘User()’ 75 | std::cin >> user; | ^~~~ In file included from /usr/include/c++/9/istream:991, from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/bits/istream.tcc:931:5: note: candidate: ‘template<class _CharT, class _Traits> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT&)’ 931 | operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c) | ^~~~~~~~ /usr/include/c++/9/bits/istream.tcc:931:5: note: template argument deduction/substitution failed: main.cpp:75:17: note: deduced conflicting types for parameter ‘_CharT’ (‘char’ and ‘User()’) 75 | std::cin >> user; | ^~~~ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:756:5: note: candidate: ‘template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char&)’ 756 | operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c) | ^~~~~~~~ /usr/include/c++/9/istream:756:5: note: template argument deduction/substitution failed: main.cpp:75:17: note: cannot convert ‘user’ (type ‘User()’) to type ‘unsigned char&’ 75 | std::cin >> user; | ^~~~ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:761:5: note: candidate: ‘template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char&)’ 761 | operator>>(basic_istream<char, _Traits>& __in, signed char& __c) | ^~~~~~~~ /usr/include/c++/9/istream:761:5: note: template argument deduction/substitution failed: main.cpp:75:17: note: cannot convert ‘user’ (type ‘User()’) to type ‘signed char&’ 75 | std::cin >> user; | ^~~~ In file included from /usr/include/c++/9/istream:991, from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/bits/istream.tcc:963:5: note: candidate: ‘template<class _CharT2, class _Traits2> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT2*)’ 963 | operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s) | ^~~~~~~~ /usr/include/c++/9/bits/istream.tcc:963:5: note: template argument deduction/substitution failed: main.cpp:75:17: note: deduced conflicting types for parameter ‘_CharT2’ (‘char’ and ‘User()’) 75 | std::cin >> user; | ^~~~ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:803:5: note: candidate: ‘template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char*)’ 803 | operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s) | ^~~~~~~~ /usr/include/c++/9/istream:803:5: note: template argument deduction/substitution failed: main.cpp:75:17: note: cannot convert ‘user’ (type ‘User()’) to type ‘unsigned char*’ 75 | std::cin >> user; | ^~~~ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:808:5: note: candidate: ‘template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char*)’ 808 | operator>>(basic_istream<char, _Traits>& __in, signed char* __s) | ^~~~~~~~ /usr/include/c++/9/istream:808:5: note: template argument deduction/substitution failed: main.cpp:75:17: note: cannot convert ‘user’ (type ‘User()’) to type ‘signed char*’ 75 | std::cin >> user; | ^~~~ In file included from /usr/include/c++/9/iostream:40, from main.cpp:1: /usr/include/c++/9/istream:980:5: note: candidate: ‘template<class _Istream, class _Tp> typename std::enable_if<std::__and_<std::__not_<std::is_lvalue_reference<_Tp> >, std::__is_convertible_to_basic_istream<_Istream>, std::__is_extractable<typename std::__is_convertible_to_basic_istream<_Tp>::__istream_type, _Tp&&, void> >::value, typename std::__is_convertible_to_basic_istream<_Tp>::__istream_type>::type std::operator>>(_Istream&&, _Tp&&)’ 980 | operator>>(_Istream&& __is, _Tp&& __x) | ^~~~~~~~ /usr/include/c++/9/istream:980:5: note: template argument deduction/substitution failed: /usr/include/c++/9/istream: In substitution of ‘template<class _Istream, class _Tp> typename std::enable_if<std::__and_<std::__not_<std::is_lvalue_reference<_Tp> >, std::__is_convertible_to_basic_istream<_Istream>, std::__is_extractable<typename std::__is_convertible_to_basic_istream<_Tp>::__istream_type, _Tp&&, void> >::value, typename std::__is_convertible_to_basic_istream<_Tp>::__istream_type>::type std::operator>>(_Istream&&, _Tp&&) [with _Istream = std::basic_istream<char>&; _Tp = User (&)()]’: main.cpp:75:17: required from here /usr/include/c++/9/istream:980:5: error: no type named ‘type’ in ‘struct std::enable_if<false, std::basic_istream<char>&>’
Hope it helps a little bit more.