Comments (6)
There is a missing
using strong_typedef::strong_typedef;
inside X.
The same for Y.
from type_safe.
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.
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.
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.
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.
Thanks a bunch! :)
from type_safe.
Related Issues (20)
- Add custom views of C++ objects in the debugger using the Natvis framework HOT 1
- abs() shouldn't change type (or handle min correctly) HOT 3
- Converting copy constructor SFINAE test seems broken HOT 1
- TYPE_SAFE_BUILD_TEST_EXAMPLE=OFF still results in building tests / examples
- README.md blog links are dead HOT 1
- How to constraint a semantic type? HOT 9
- Failed to compile with MSVC HOT 1
- Linker error in specific circumstances with Doctest HOT 6
- Create a New Release HOT 1
- Add __declspec(empty_bases) to integer_arithmetic and floating_point_arithmetic HOT 2
- strong_typedef is not structural
- Allow implicit narrowing conversion if constexpr is known to fit HOT 5
- strong_typedef: numeric_limits HOT 1
- Make is_strong_typedef public HOT 3
- Bitwise operations for integer_ops HOT 5
- CMake installation is not architecture independent HOT 2
- Clashes with type like uint8_t HOT 1
- Standard library module HOT 2
- Fix or work around a probable MS compiler bug when using C++ 20 or above HOT 1
- std::aligned_storage_t are deprecated in C++23 HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from type_safe.