Search code examples
c++buildcompiler-errors

Why does a C3889 Error occur in xutility when I try to build/generate a C++ solution?


I'm still new to C++, and I have to create an online store by defining a few classes. But the thing is, even after having gotten rid of all the errors in my files, Visual Studio shows me an error in an xutility file : Error C3889 call to a class object « std::equal_to » : corresponding call operator not found. I don't really know what this file is, but after a few researches I simply found out that there might be an error if one of my functions/classes has the same name as one from this file. Also, here is the part of the code where the error occurs ( last for loop, on _Pred ) :

template <class _InIt1, class _InIt2, class _Pr> _NODISCARD _CONSTEXPR20 bool equal(const _InIt1 _First1, const _InIt1 _Last1, const _InIt2 _First2, _Pr _Pred) { compare [_First1, _Last1) to [_First2, ...) _Adl_verify_range(_First1, _Last1); auto _UFirst1 = _Get_unwrapped(_First1); const auto _ULast1 = _Get_unwrapped(_Last1); auto _UFirst2 = _Get_unwrapped_n(_First2, _Idl_distance<_InIt1>(_UFirst1, _ULast1)); if constexpr (_Equal_memcmp_is_safe<decltype(_UFirst1), decltype(_UFirst2), _Pr>) { #if _HAS_CXX20 if (!_STD is_constant_evaluated()) #endif // _HAS_CXX20 { return _Memcmp_ranges(_UFirst1, _ULast1, _UFirst2) == 0; } }

for (; _UFirst1 != _ULast1; ++_UFirst1, (void) ++_UFirst2) { if (!_Pred(*_UFirst1, *_UFirst2)) { return false; } }

return true; }

I can't provide my code, for there are several files, but they're available here if it's necessary : https://github.com/DZburst/TP2_Online_Store

Any help would truly be appreciated, Thanks by advance


Solution

  • Client:

    std::ostream& client::operator<<(std::ostream& os, Client& client)
    

    should have been

    std::ostream& client::operator<<(std::ostream& os, const Client& client)
    //                                                 ^^^^^
    

    and for that to work, the member function client::Client::panier() should be const qualified and preferably not return a copy of the vector, but a const& to the contained vector. Since you also need a non-const version in Magasin I suggest making the function overloaded. In both cases, return by reference:

    std::vector<produit::Produit>& client::Client::panier()
    //                           ^
    std::vector<produit::Produit> const& client::Client::panier() const
    //                            ^^^^^^                          ^^^^^
    

    and

    bool client::Client::operator==(Client& client)
    

    should have been

    bool client::Client::operator==(const Client& client) const
    //                              ^^^^^                 ^^^^^
    

    (or a non-member function taking two Clients by const&)

    You should also #include <vector> in Client.h


    Produit

    bool produit::Produit::operator == (Produit& produit)
    bool produit::Produit::operator != (Produit& produit)
    

    should have been

    bool produit::Produit::operator == (const Produit& produit) const
    bool produit::Produit::operator != (const Produit& produit) const
    //                                  ^^^^^                   ^^^^^
    

    (or non-members taking two Produits by const&)


    With those fixed, it all compiles fine.