Giter VIP home page Giter VIP logo

Comments (6)

viboes avatar viboes commented on June 2, 2024

There is a missing

using strong_typedef::strong_typedef;

inside X.

The same for Y.

from type_safe.

JohelEGP avatar JohelEGP commented on June 2, 2024

The compiler-generated default constructors default construct the bases, so that's not the problem.
Here's the actual error:

main.cpp:6:22: error: use of overloaded operator '==' is ambiguous (with operand types 'Y' and 'Y')
constexpr bool _{Y{} == Y{}}; // errors
                 ~~~ ^  ~~~
type_safe/strong_typedef.hpp:310:9: note: candidate function
      [with StrongTypedef = X, Other = Y, $2 = void]
        TYPE_SAFE_DETAIL_MAKE_OP(==, equality_comparison, bool)
        ^
type_safe/strong_typedef.hpp:206:22: note: expanded from macro 'TYPE_SAFE_DETAIL_MAKE_OP'
    constexpr Result operator Op(Name<StrongTypedef>&& lhs, Other&& rhs)                           \
                     ^
type_safe/strong_typedef.hpp:310:9: note: candidate function
      [with StrongTypedef = X, Other = Y, $2 = void]
type_safe/strong_typedef.hpp:198:22: note: expanded from macro 'TYPE_SAFE_DETAIL_MAKE_OP'
    constexpr Result operator Op(const Name<StrongTypedef>& lhs, Other&& rhs)                      \
                     ^
type_safe/strong_typedef.hpp:310:9: note: candidate function
      [with StrongTypedef = X, Other = Y, $2 = void]
type_safe/strong_typedef.hpp:223:22: note: expanded from macro 'TYPE_SAFE_DETAIL_MAKE_OP'
    constexpr Result operator Op(Other&& lhs, Name<StrongTypedef>&& rhs)                           \
                     ^
type_safe/strong_typedef.hpp:310:9: note: candidate function
      [with StrongTypedef = X, Other = Y, $2 = void]
type_safe/strong_typedef.hpp:214:22: note: expanded from macro 'TYPE_SAFE_DETAIL_MAKE_OP'
    constexpr Result operator Op(Other&& lhs, const Name<StrongTypedef>& rhs)                      \
                     ^
1 error generated.

from type_safe.

foonathan avatar foonathan commented on June 2, 2024

Thanks for reporting this. I've now added test cases to prevent further errors.

Note that you're example still doesn't compile under C++11 due to constexpr limitations I can't workaround.

from type_safe.

JohelEGP avatar JohelEGP commented on June 2, 2024

I'm still getting the same error (with the added overloads).

I think I found out why this is happening from looking at the following error from my non-contrived, still unreleased source code.

../include/rpg2d/eng/utility.hpp:60:16: error: use of overloaded operator '==' is ambiguous (with operand types 'rpg2d::eng::Abscissa'
      (aka 'Unit<int, struct _abscissa>') and 'rpg2d::eng::Abscissa')
    return l.x == r.x && l.y == r.y;
           ~~~ ^  ~~~
type_safe/strong_typedef.hpp:342:9: note: candidate function [with StrongTypedef =
      jegp::Strong_typedef<int, rpg2d::eng::_abscissa>, Other = rpg2d::Unit<int, rpg2d::eng::_abscissa> &, $2 = void]
        TYPE_SAFE_DETAIL_MAKE_OP(==, equality_comparison, bool)
        ^
type_safe/strong_typedef.hpp:230:22: note: expanded from macro 'TYPE_SAFE_DETAIL_MAKE_OP'
    constexpr Result operator Op(const Name<StrongTypedef>& lhs, Other&& rhs)                      \
                     ^
type_safe/strong_typedef.hpp:342:9: note: candidate function [with StrongTypedef =
      jegp::Strong_typedef<int, rpg2d::eng::_abscissa>, Other = rpg2d::Unit<int, rpg2d::eng::_abscissa> &, $2 = void]
type_safe/strong_typedef.hpp:246:22: note: expanded from macro 'TYPE_SAFE_DETAIL_MAKE_OP'
    constexpr Result operator Op(Other&& lhs, const Name<StrongTypedef>& rhs)                      \
                     ^
type_safe/strong_typedef.hpp:342:9: note: candidate function [with StrongTypedef =
      jegp::Strong_typedef<int, rpg2d::eng::_abscissa>]
type_safe/strong_typedef.hpp:198:22: note: expanded from macro 'TYPE_SAFE_DETAIL_MAKE_OP'
    constexpr Result operator Op(const Name<StrongTypedef>& lhs, const Name<StrongTypedef>& rhs)   \
                     ^

Unit is a Strong_typedef (which is a type_safe::strong_typedef) by public inheritance. The new overload (last candidate in the error) is correctly considered, but the ones with the Other parameter are too. This is the SFINAE condition of the Other overloads:

template <typename From, typename To>
using enable_if_convertible = typename std::enable_if<
    !std::is_same<typename std::decay<From>::type, To>::value
    && std::is_convertible<typename std::decay<From>::type, To>::value>::type;

From is Other&& and To the StrongTypedef. So in my error From is Unit and To is Strong_typedef. As Unit is convertible to Strong_typedef, the Other overloads are considered. Simply adding !std::is_base_of<To, typename std::decay<From>::type>::value to the SFINAE check considers this composition by inheritance and makes the code well-formed.

from type_safe.

foonathan avatar foonathan commented on June 2, 2024

I'm sorry, I modified your example and forgot to change it back later.

This was the only test case, I'm missing you're right and your fix works.

from type_safe.

JohelEGP avatar JohelEGP commented on June 2, 2024

Thanks a bunch! :)

from type_safe.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.