Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Special Interest Groups
  3. C++ Gurus
  4. error overloading compare operator for struct
Forum Update on Monday, May 27th 2025

error overloading compare operator for struct

Scheduled Pinned Locked Moved Solved C++ Gurus
13 Posts 4 Posters 2.4k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • JoeCFDJ Online
    JoeCFDJ Online
    JoeCFD
    wrote on last edited by JoeCFD
    #3

    @mzimmers said in error overloading compare operator for struct:

    bool operator==(const EquipmentItem &lhs, const EquipmentItem &rhs)
    {
    bool rc = false;
    if (lhs.m_name == rhs.m_name)
    rc = true;
    return rc;
    }

    ??????????

    bool operator==(const EquipmentItem &rhs)
    {
        bool rc = false;
        if (this->m_name == rhs.m_name)
            rc = true;
        return rc;
    }
    
    1 Reply Last reply
    0
    • Axel SpoerlA Offline
      Axel SpoerlA Offline
      Axel Spoerl
      Moderators
      wrote on last edited by Axel Spoerl
      #4

      Hi @mzimmers.
      you are not really overloading operator==. You have to define it within the struct (or implement it directly). For that purpose you have to have in mind that this will be an implicit argument within the struct, so you only have to mention it in an implementation out of line.
      That said, something like this should ferry you across the river:

      a) direct implementation

      // EquipmentItem must be a struct;
      // if we make it a QObject-based class, we lose the assignment operator.
      struct EquipmentItem
      {
          Q_GADGET
      public:
          QString m_name;
          bool operator==(const EquipmentItem &left) const
          {
              return left.m_name == m_name;
          }
      };
      

      b) definition and implementation out of line

      // EquipmentItem must be a struct;
      // if we make it a QObject-based class, we lose the assignment operator.
      struct EquipmentItem
      {
          Q_GADGET
      public:
          QString m_name;
          bool operator==(const EquipmentItem &left) const;
      };
      
      // somewhere else
      bool EquipmentItem::operator==(const EquipmentItem &left, const EquipmentItem &right) const
      {
          return left.m_name == right.m_name;
      }
      
      

      Software Engineer
      The Qt Company, Oslo

      1 Reply Last reply
      2
      • Axel SpoerlA Offline
        Axel SpoerlA Offline
        Axel Spoerl
        Moderators
        wrote on last edited by Axel Spoerl
        #5

        @Christian-Ehrlicher kindly and competently reminded me that operator== has to be const.
        Thanks! (previous post edited for correction)

        Software Engineer
        The Qt Company, Oslo

        1 Reply Last reply
        0
        • mzimmersM Offline
          mzimmersM Offline
          mzimmers
          wrote on last edited by
          #6

          Well, I can't provide a compilable example, but here are my files:

          equipmentitem.h:

          #ifndef EQUIPMENTITEM_H
          #define EQUIPMENTITEM_H
          
          #include <QObject>
          
          // EquipmentItem must be a struct;
          // if we make it a QObject-based class, we lose the assignment operator.
          struct EquipmentItem
          {
              Q_GADGET
          public:
              QString m_name;
              bool operator==(const EquipmentItem &rhs);
          };
          
          #endif // EQUIPMENTITEM_H
          

          equipmentitem.cpp:

          bool EquipmentItem::operator==(const EquipmentItem &rhs)
          {
              bool rc = false;
              do {
                  if (m_name != rhs.m_name)
                      continue;
                  rc = true;
              } while (false);
              return rc;
          }
          

          Trying to build with this in a CMake project yields the errors above.

          I notice that the errors are exposed in my qmetaobject.h file, so I deleted my build directory and re-ran CMake, etc. with no change in results.

          1 Reply Last reply
          0
          • Christian EhrlicherC Offline
            Christian EhrlicherC Offline
            Christian Ehrlicher
            Lifetime Qt Champion
            wrote on last edited by
            #7

            As always - simplify your program until it's short enough so we can compile it here or the error goes away - the task of a programmer.

            Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
            Visit the Qt Academy at https://academy.qt.io/catalog

            1 Reply Last reply
            1
            • Axel SpoerlA Offline
              Axel SpoerlA Offline
              Axel Spoerl
              Moderators
              wrote on last edited by
              #8

              Change the definition to
              bool operator==(const EquipmentItem &rhs) const;

              ...and the implementation to my proposal from the previous post.

              Software Engineer
              The Qt Company, Oslo

              mzimmersM 1 Reply Last reply
              0
              • Axel SpoerlA Axel Spoerl

                Change the definition to
                bool operator==(const EquipmentItem &rhs) const;

                ...and the implementation to my proposal from the previous post.

                mzimmersM Offline
                mzimmersM Offline
                mzimmers
                wrote on last edited by mzimmers
                #9

                @Axel-Spoerl I'm confused - which implementation should I be using? When I try this:

                bool EquipmentItem::operator==(const EquipmentItem &lhs, const EquipmentItem &rhs) const {
                    ...
                

                I get an additional error:

                C:\Users\Michael.Zimmers\Qt_projects\nga_demo\equipmentitem.cpp:28: error: Overloaded 'operator==' must be a binary operator (has 3 parameters)
                

                EDIT:

                I can get rid of that error by coding this instead:

                bool EquipmentItem::operator==(const EquipmentItem &rhs) const {
                

                But the original errors remain.

                EDIT 2:

                I took Christian's suggestion, and put those files in an otherwise empty project, and it builds without error. So, I guess this is no longer a C++ issue.

                Thanks for all the assistance.

                1 Reply Last reply
                0
                • Axel SpoerlA Offline
                  Axel SpoerlA Offline
                  Axel Spoerl
                  Moderators
                  wrote on last edited by
                  #10

                  The { at the end was my typo.
                  Best to use one of the options I have proposed above.

                  Software Engineer
                  The Qt Company, Oslo

                  1 Reply Last reply
                  0
                  • mzimmersM Offline
                    mzimmersM Offline
                    mzimmers
                    wrote on last edited by
                    #11

                    OK, so I found the problem, and the operator overload was a red herring (though I was indeed doing it wrong).

                    It turns out that in my experimentation with the overload operator, I accidently changed this line in the qmetaobject.h file:

                    // from   
                     friend bool operator ==(const QMetaMethod &lhs, const QMetaMethod &m2)
                    // to
                    friend EquipmentItem operator ==(const QMetaMethod &lhs, const QMetaMethod &m2)
                    

                    Oops. I think this happened when I mindlessly clicked on a light bulb icon...I should have been more careful.

                    To find this, I just needed to look at the complete error messages (which I didn't post here) a little more carefully.

                    Two lessons from this:

                    1. My Qt installation should probably be readonly, yes?
                    2. Might be better to use github rather than the installer for downnloading Qt, so that I can easily see when a file got changed.

                    Anyway, thanks again for looking.

                    mzimmersM 1 Reply Last reply
                    3
                    • Axel SpoerlA Offline
                      Axel SpoerlA Offline
                      Axel Spoerl
                      Moderators
                      wrote on last edited by
                      #12

                      Thanks for sharing!
                      Regarding 1) and 2) - git is my preference.
                      (Comes with a handy advantage: When you find a way to make Qt even better, you can just push it ;-)

                      Software Engineer
                      The Qt Company, Oslo

                      1 Reply Last reply
                      0
                      • mzimmersM mzimmers

                        OK, so I found the problem, and the operator overload was a red herring (though I was indeed doing it wrong).

                        It turns out that in my experimentation with the overload operator, I accidently changed this line in the qmetaobject.h file:

                        // from   
                         friend bool operator ==(const QMetaMethod &lhs, const QMetaMethod &m2)
                        // to
                        friend EquipmentItem operator ==(const QMetaMethod &lhs, const QMetaMethod &m2)
                        

                        Oops. I think this happened when I mindlessly clicked on a light bulb icon...I should have been more careful.

                        To find this, I just needed to look at the complete error messages (which I didn't post here) a little more carefully.

                        Two lessons from this:

                        1. My Qt installation should probably be readonly, yes?
                        2. Might be better to use github rather than the installer for downnloading Qt, so that I can easily see when a file got changed.

                        Anyway, thanks again for looking.

                        mzimmersM Offline
                        mzimmersM Offline
                        mzimmers
                        wrote on last edited by
                        #13

                        @mzimmers said in error overloading compare operator for struct:

                        My Qt installation should probably be readonly, yes?

                        Definitely NO. It might be OK to lock down some areas, but I just finished chasing down a problem due to making some android templates readonly -- it caused my builds to break. Just a cautionary note...

                        1 Reply Last reply
                        0

                        • Login

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved