1
votes

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.

1
What specific issue are you running into? Can you show us the input to the program you’re giving and the output that isn’t correct?templatetypedef
Welcome to stackoverflow. As stated above, please provide the exact problem you have with your source code. Currently we can only guess, what's going wrong.KBO
The only thing that the vscode tell me is that "no operator '>>' matches these operands -- operand types are: std::istream >> User ()". I was following a tutorial on youtube on the subject (operator overload), the "<<" worked fine but i got the above error when overloading ">>"Andrés Moreno

1 Answers

2
votes

In main(), User user(); declares a function named user that takes no arguments and returns a User. That is not what you want in this situation. You want an object instance instead. So, you need to drop the parenthesis from the declaration, eg: User user; That declares a variable named user of type User and then calls its default constructor.

Also, in operator<<, the 2nd parameter should be declared as const User& user instead.