mpusz / mp-units

The quantities and units library for C++
https://mpusz.github.io/mp-units/
MIT License
997 stars 79 forks source link

conan2 breaking example #508

Closed wouterz closed 8 months ago

wouterz commented 8 months ago

I've been trying implement this library into a project, but I've run into an issue that I've narrowed down to one of the examples (hello_units) also not compiling as should. For a simplified version

Were using the library with conan; conanfile.txt

[requires]
mp-units/2.0.0

[layout]
cmake_layout

[generators]
CMakeToolchain
CMakeDeps

profile

 [settings]
 arch=x86_64
 build_type=Debug
 compiler=gcc
 compiler.cppstd=20
 compiler.libcxx=libstdc++11
 compiler.version=12
 os=Linux
 [options]
 [buildenv]
 [tool_requires]
 [conf]
 tools.cmake.cmaketoolchain:generator=Unix Makefiles
~                                                                

hello_units_mini.cpp

#include <mp-units/format.h>
#include <mp-units/ostream.h>
#include <mp-units/systems/international/international.h>
#include <mp-units/systems/isq/isq.h>
#include <mp-units/systems/si/si.h>

#include <iostream>

using namespace mp_units;

constexpr QuantityOf<isq::speed> auto avg_speed(QuantityOf<isq::length> auto d,
                                                QuantityOf<isq::time> auto t) {
  return d / t;
}

int main() {
  using namespace mp_units::si::unit_symbols;
  using namespace mp_units::international::unit_symbols;

  #constexpr quantity v1 = (110 * km) / s;  # << Does not compile, template substitution errors
  constexpr quantity v11 = (110 * km) / (1 * h); # << Works fine
  return 0;

All other lines in this example compile and run. The code is compiled with CMake linking mp-units::mp-units.

Here are the errors (click for full log):

``` [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:38: error: no match for ‘operator/’ (operand types are ‘mp_units::quantity(), int>’ and ‘const mp_units::si::second’) [build] 20 | constexpr quantity v1 = (110 * km) / s; [build] | ~~~~~~~~~~ ^ ~ [build] | | | [build] | | const mp_units::si::second [build] | mp_units::quantity(), int> ``` ``` [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:38: error: no match for ‘operator/’ (operand types are ‘mp_units::quantity(), int>’ and ‘const mp_units::si::second’) [build] 20 | constexpr quantity v1 = (110 * km) / s; [build] | ~~~~~~~~~~ ^ ~ [build] | | | [build] | | const mp_units::si::second [build] | mp_units::quantity(), int> [build] In file included from /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/unit_concepts.h:26, [build] from /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/reference_concepts.h:26, [build] from /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/quantity_concepts.h:26, [build] from /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity.h:27, [build] from /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/format.h:28, [build] from /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:1: [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/magnitude.h:645:30: note: candidate: ‘template requires (Magnitude) && (Magnitude) consteval auto mp_units::operator/(auto:36, auto:37)’ [build] 645 | [[nodiscard]] consteval auto operator/(Magnitude auto l, Magnitude auto r) { return l * pow<-1>(r); } [build] | ^~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/magnitude.h:645:30: note: template argument deduction/substitution failed: [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/magnitude.h:645:30: note: constraints not satisfied [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/magnitude.h: In substitution of ‘template requires (Magnitude) && (Magnitude) consteval auto mp_units::operator/(auto:36, auto:37) [with auto:36 = mp_units::quantity(), int>; auto:37 = mp_units::si::second]’: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:40: required from here [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/magnitude.h:63:9: required for the satisfaction of ‘Magnitude’ [with auto:36 = mp_units::quantity<{}, int>] [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/magnitude.h:63:29: note: the expression ‘is_magnitude [with T = mp_units::quantity<{}, int>]’ evaluated to ‘false’ [build] 63 | concept Magnitude = detail::is_magnitude; [build] | ~~~~~~~~^~~~~~~~~~~~~~~ [build] In file included from /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity_spec.h:34, [build] from /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/get_associated_quantity.h:27, [build] from /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/unit.h:30, [build] from /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/sudo_cast.h:29, [build] from /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity.h:31: [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/dimension.h:147:40: note: candidate: ‘template requires (Dimension) && (Dimension) consteval auto [requires mp_units::Dimension<, >] mp_units::operator/(Lhs, Rhs)’ [build] 147 | [[nodiscard]] consteval Dimension auto operator/(Lhs, Rhs) [build] | ^~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/dimension.h:147:40: note: template argument deduction/substitution failed: [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/dimension.h:147:40: note: constraints not satisfied [build] In file included from /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity.h:26: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp: In substitution of ‘template requires (Dimension) && (Dimension) consteval auto [requires mp_units::Dimension<, >] mp_units::operator/(Lhs, Rhs) [with Lhs = mp_units::quantity(), int>; Rhs = mp_units::si::second]’: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:40: required from here [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/dimension_concepts.h:102:9: required for the satisfaction of ‘Dimension’ [with Lhs = mp_units::quantity<{}, int>] [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/dimension_concepts.h:102:46: note: no operand of the disjunction is satisfied [build] 102 | concept Dimension = detail::BaseDimension || detail::DerivedDimension; [build] | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [build] cc1plus: note: set ‘-fconcepts-diagnostics-depth=’ to at least 2 for more detail [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/dimension.h:154:40: note: candidate: ‘template requires Dimension consteval auto [requires mp_units::Dimension<, >] mp_units::operator/(int, D)’ [build] 154 | [[nodiscard]] consteval Dimension auto operator/(int value, D) [build] | ^~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/dimension.h:154:40: note: template argument deduction/substitution failed: [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/dimension.h:154:40: note: constraints not satisfied [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp: In substitution of ‘template requires Dimension consteval auto [requires mp_units::Dimension<, >] mp_units::operator/(int, D) [with D = mp_units::si::second]’: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:40: required from here [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/dimension_concepts.h:102:9: required for the satisfaction of ‘Dimension’ [with D = mp_units::si::second] [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/dimension_concepts.h:102:46: note: no operand of the disjunction is satisfied [build] 102 | concept Dimension = detail::BaseDimension || detail::DerivedDimension; [build] | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/dimension.h:161:40: note: candidate: ‘template requires Dimension consteval auto [requires mp_units::Dimension<, >] mp_units::operator/(D, int)’ (deleted) [build] 161 | [[nodiscard]] consteval Dimension auto operator/(D, int) = delete; [build] | ^~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/dimension.h:161:40: note: template argument deduction/substitution failed: [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/dimension.h:161:40: note: constraints not satisfied [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp: In substitution of ‘template requires Dimension consteval auto [requires mp_units::Dimension<, >] mp_units::operator/(D, int) [with D = mp_units::quantity(), int>]’: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:40: required from here [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/dimension_concepts.h:102:9: required for the satisfaction of ‘Dimension’ [with D = mp_units::quantity<{}, int>] [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/dimension_concepts.h:102:46: note: no operand of the disjunction is satisfied [build] 102 | concept Dimension = detail::BaseDimension || detail::DerivedDimension; [build] | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity_spec.h:504:43: note: candidate: ‘template requires (QuantitySpec) && (QuantitySpec) consteval auto [requires mp_units::QuantitySpec<, >] mp_units::operator/(Lhs, Rhs)’ [build] 504 | [[nodiscard]] consteval QuantitySpec auto operator/(Lhs lhs, Rhs rhs) [build] | ^~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity_spec.h:504:43: note: template argument deduction/substitution failed: [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity_spec.h:504:43: note: constraints not satisfied [build] In file included from /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/quantity_concepts.h:25: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp: In substitution of ‘template requires (QuantitySpec) && (QuantitySpec) consteval auto [requires mp_units::QuantitySpec<, >] mp_units::operator/(Lhs, Rhs) [with Lhs = mp_units::quantity(), int>; Rhs = mp_units::si::second]’: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:40: required from here [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/quantity_spec_concepts.h:129:9: required for the satisfaction of ‘QuantitySpec’ [with Lhs = mp_units::quantity<{}, int>] [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/quantity_spec_concepts.h:130:78: note: no operand of the disjunction is satisfied [build] 130 | detail::NamedQuantitySpec || detail::IntermediateDerivedQuantitySpec || detail::QuantityKindSpec; [build] | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity_spec.h:511:43: note: candidate: ‘template requires QuantitySpec consteval auto [requires mp_units::QuantitySpec<, >] mp_units::operator/(int, auto:51)’ [build] 511 | [[nodiscard]] consteval QuantitySpec auto operator/(int value, QuantitySpec auto q) [build] | ^~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity_spec.h:511:43: note: template argument deduction/substitution failed: [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity_spec.h:511:43: note: constraints not satisfied [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp: In substitution of ‘template requires QuantitySpec consteval auto [requires mp_units::QuantitySpec<, >] mp_units::operator/(int, auto:51) [with auto:51 = mp_units::si::second]’: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:40: required from here [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/quantity_spec_concepts.h:129:9: required for the satisfaction of ‘QuantitySpec’ [with auto:51 = mp_units::si::second] [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/quantity_spec_concepts.h:130:78: note: no operand of the disjunction is satisfied [build] 130 | detail::NamedQuantitySpec || detail::IntermediateDerivedQuantitySpec || detail::QuantityKindSpec; [build] | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity_spec.h:517:43: note: candidate: ‘template requires QuantitySpec consteval auto [requires mp_units::QuantitySpec<, >] mp_units::operator/(auto:52, int)’ (deleted) [build] 517 | [[nodiscard]] consteval QuantitySpec auto operator/(QuantitySpec auto, int) = delete; [build] | ^~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity_spec.h:517:43: note: template argument deduction/substitution failed: [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity_spec.h:517:43: note: constraints not satisfied [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp: In substitution of ‘template requires QuantitySpec consteval auto [requires mp_units::QuantitySpec<, >] mp_units::operator/(auto:52, int) [with auto:52 = mp_units::quantity(), int>]’: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:40: required from here [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/quantity_spec_concepts.h:129:9: required for the satisfaction of ‘QuantitySpec’ [with auto:52 = mp_units::quantity<{}, int>] [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/quantity_spec_concepts.h:130:78: note: no operand of the disjunction is satisfied [build] 130 | detail::NamedQuantitySpec || detail::IntermediateDerivedQuantitySpec || detail::QuantityKindSpec; [build] | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/unit.h:439:44: note: candidate: ‘template requires (Unit) && (Unit) consteval auto [requires mp_units::Unit<, >] mp_units::operator/(Lhs, Rhs)’ [build] 439 | [[nodiscard]] MP_UNITS_CONSTEVAL Unit auto operator/(Lhs lhs, Rhs rhs) [build] | ^~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/unit.h:439:44: note: template argument deduction/substitution failed: [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/unit.h:439:44: note: constraints not satisfied [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/unit_concepts.h: In substitution of ‘template requires (Unit) && (Unit) consteval auto [requires mp_units::Unit<, >] mp_units::operator/(Lhs, Rhs) [with Lhs = mp_units::quantity(), int>; Rhs = mp_units::si::second]’: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:40: required from here [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/unit_concepts.h:46:9: required for the satisfaction of ‘Unit’ [with Lhs = mp_units::quantity<{}, int>] [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/unit_concepts.h:46:36: note: the expression ‘mp_units::detail::is_unit::value [with T = mp_units::quantity<{}, int>]’ evaluated to ‘false’ [build] 46 | concept Unit = detail::is_unit::value; [build] | ^~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/unit.h:451:44: note: candidate: ‘template requires Unit consteval auto [requires mp_units::Unit<, >] mp_units::operator/(int, auto:64)’ [build] 451 | [[nodiscard]] MP_UNITS_CONSTEVAL Unit auto operator/(int value, Unit auto u) [build] | ^~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/unit.h:451:44: note: template argument deduction/substitution failed: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:32: note: cannot convert ‘mp_units::operator* >(110, (mp_units::si::unit_symbols::km, const mp_units::si::kilo_()))’ (type ‘mp_units::quantity(), int>’) to type ‘int’ [build] 20 | constexpr quantity v1 = (110 * km) / s; [build] | ~~~~~^~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/unit.h:457:35: note: candidate: ‘template requires Unit consteval auto [requires mp_units::Unit<, >] mp_units::operator/(auto:65, int)’ (deleted) [build] 457 | [[nodiscard]] consteval Unit auto operator/(Unit auto, int) = delete; [build] | ^~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/unit.h:457:35: note: template argument deduction/substitution failed: [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/unit.h:457:35: note: constraints not satisfied [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/unit_concepts.h: In substitution of ‘template requires Unit consteval auto [requires mp_units::Unit<, >] mp_units::operator/(auto:65, int) [with auto:65 = mp_units::quantity(), int>]’: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:40: required from here [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/unit_concepts.h:46:9: required for the satisfaction of ‘Unit’ [with auto:65 = mp_units::quantity<{}, int>] [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/unit_concepts.h:46:36: note: the expression ‘mp_units::detail::is_unit::value [with T = mp_units::quantity<{}, int>]’ evaluated to ‘false’ [build] 46 | concept Unit = detail::is_unit::value; [build] | ^~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity.h:423:39: note: candidate: ‘template requires InvokeResultOf<(mp_units::get_quantity_spec(R1) / mp_units::get_quantity_spec(R2)).character, std::divides, Rep1, Rep2> constexpr auto [requires mp_units::Quantity<, >] mp_units::operator/(const quantity&, const quantity&)’ [build] 423 | [[nodiscard]] constexpr Quantity auto operator/(const quantity& lhs, const quantity& rhs) [build] | ^~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity.h:423:39: note: template argument deduction/substitution failed: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:40: note: ‘const mp_units::si::second’ is not derived from ‘const mp_units::quantity’ [build] 20 | constexpr quantity v1 = (110 * km) / s; [build] | ^ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity.h:432:39: note: candidate: ‘template requires !(Quantity) && (InvokeResultOf, Rep, const Value&>) constexpr auto [requires mp_units::Quantity<, >] mp_units::operator/(const quantity&, const Value&)’ [build] 432 | [[nodiscard]] constexpr Quantity auto operator/(const quantity& q, const Value& v) [build] | ^~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity.h:432:39: note: template argument deduction/substitution failed: [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity.h:432:39: note: constraints not satisfied [build] In file included from /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/quantity_concepts.h:27: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp: In substitution of ‘template requires !(Quantity) && (InvokeResultOf, Rep, const Value&>) constexpr auto [requires mp_units::Quantity<, >] mp_units::operator/(const quantity&, const Value&) [with auto R = mp_units::si::kilo_(); Rep = int; Value = mp_units::si::second]’: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:40: required from here [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/representation_concepts.h:79:9: required for the satisfaction of ‘Representation’ [with T = mp_units::derived_unit >] [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/representation_concepts.h:82:9: required for the satisfaction of ‘RepresentationOf::type, Ch>’ [with Func = std::divides; U = const mp_units::si::second&; T = int; Ch = (get_quantity_spec(mp_units::si::kilo_<{}>)((_ZTAXtlN8mp_units2si5kilo_IXtlNS0_5metreEEEEEEE, const mp_units::si::kilo_<{}>())), mp_units::quantity_spec, {}>::character)] [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity.h:61:9: required for the satisfaction of ‘InvokeResultOf, Rep, const Value&>’ [with R = _ZTAXtlN8mp_units2si5kilo_IXtlNS0_5metreEEEEEEE; Rep = int; Value = mp_units::si::second] [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/bits/representation_concepts.h:79:56: note: no operand of the disjunction is satisfied [build] 79 | concept Representation = (is_scalar || is_vector || is_tensor)&&std::regular && detail::Scalable; [build] | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity.h:441:39: note: candidate: ‘template requires !(Quantity) && (InvokeResultOf, const Value&, Rep>) constexpr auto [requires mp_units::Quantity<, >] mp_units::operator/(const Value&, const quantity&)’ [build] 441 | [[nodiscard]] constexpr Quantity auto operator/(const Value& v, const quantity& q) [build] | ^~~~~~~~ [build] /home/wslouter/.conan2/p/mp-un51f935390d24e/p/include/mp-units/quantity.h:441:39: note: template argument deduction/substitution failed: [build] /home/wslouter/Projects/test/mp_units/src/hello_units.cpp:20:40: note: ‘const mp_units::si::second’ is not derived from ‘const mp_units::quantity’ [build] 20 | constexpr quantity v1 = (110 * km) / s; [build] | ^ ```

Which dont really make sense to me in unit(_symbols).h

(inline constexpr auto km = kilo<metre>;)
inline constexpr struct second : named_unit<"s", kind_of<isq::time>> {} second;
inline constexpr struct metre : named_unit<"m", kind_of<isq::length>> {} metre;

and in space_and_time.h

QUANTITY_SPEC(speed, length / time);                         // differs from ISO 80000

Im also fine with by multiplying a quantity by 1, but as this breaks an example I wanted to report this issue. Also willing to contribute a fix if you can point me in the right direction to fix it.

mpusz commented 8 months ago

Thanks for reporting! This issue is expected, as we loosened the restrictions on quantity creation with #496 only after the 2.0 was released. It will be supported from 2.1. We hope to release it soon, but we need to finish some changes first.

This example should be working fine on the Compiler Explorer when the mainline version is selected. Also, you can try https://mpusz.github.io/mp-units/2.1/getting_started/installation_and_usage/#conan-cmake-live-at-head to get the latest stable version through Conan.

wouterz commented 8 months ago

Thanks for the quick response!

mpusz commented 8 months ago

You are welcome! 😃

Please let us know if this resolves your issue and if we can close it now.

wouterz commented 8 months ago

I wont switch to the live head version for stability reasons, but ill close it and try to make it work!