C ++值在常量表达式中不可用

时间:2017-03-22 10:50:45

标签: c++ unit-testing initialization expression constants

我在C ++中编写了以下代码。我必须承认我对这门语言很新,但我正在努力学习:)

var token: NotificationToken?
token = yourRealmObject.addNotificationBlock { change in
    switch change {
    case .change(let properties):
        print("Object has changed")
    case .error(let error):
        print("An error occurred: \(error)")
    case .deleted:
        print("The object was deleted.")
    }
}

现在,当运行第#include <iostream> #include <cassert> enum class Unit { km, m, cm }; template<int v, Unit u> struct Measure { static const int value = v; static const Unit unit = u; }; template<typename M1, typename M2> struct Measures_same { static const bool value() { return M1::unit == M2::unit; } }; template<typename M1, typename M2> struct SmallestUnit { static const Unit value() { switch(M1::unit) { case Unit::km: return M2::unit; case Unit::m: switch (M2::unit) { case Unit::km: return M1::unit; case Unit::m: return M2::unit; case Unit::cm: return M2::unit; } case Unit::cm: return M1::unit; } }; }; template<typename M1, typename M2> struct Measure_difference { static const int value(){ if(Measures_same<M1,M2>::value()){ return 0; } Unit smallestValue = SmallestUnit<M1, M2>::value(); Unit largestValue; if(M1::unit == smallestValue){ largestValue = M2::unit; } else{ largestValue = M1::unit; } switch(smallestValue) { case Unit::m: switch (largestValue) { case Unit::km: return 1000; } case Unit::cm: switch (largestValue) { case Unit::km: return 1000 * 1000; case Unit::m: return 1000; } } } }; template<typename M1, typename M2> struct Measure_add { static const M1 value(){ if(Measures_same<M1,M2>::value()){ return Measure<(M1::value + M2::value), M1::unit>(); } Unit smallestValue = SmallestUnit<decltype(M1::unit), decltype(M2::unit)>::value(); int const difference = Measure_difference<M1,M2>::value(); if(M1::unit == smallestValue){ return Measure<(M1::value + (M2::value * difference)), M1::unit>(); } else{ return Measure<(M2::value + (M1::value * difference)), M2::unit>(); } } }; void testMeasuresSame(){ assert((Measures_same<Measure<10,Unit::km>, Measure<10,Unit::km>>::value()) == true); assert((Measures_same<Measure<10,Unit::km>, Measure<10,Unit::m>>::value()) == false); assert((Measures_same<Measure<10,Unit::cm>, Measure<10,Unit::m>>::value()) == false); } void testSmallestUnit(){ assert((SmallestUnit<Measure<1, Unit::km>, Measure<2, Unit::km>>::value()) == Unit::km); assert((SmallestUnit<Measure<10,Unit::km>, Measure<10,Unit::m>>::value()) == Unit::m); assert((SmallestUnit<Measure<10,Unit::cm>, Measure<10,Unit::m>>::value()) == Unit::cm); } void testMeasureDifference(){ assert((Measure_difference<Measure<1, Unit::km>, Measure<2, Unit::km>>::value()) == 0); assert((Measure_difference<Measure<10,Unit::km>, Measure<10,Unit::m>>::value()) == 1000); assert((Measure_difference<Measure<10,Unit::cm>, Measure<10,Unit::m>>::value()) == 1000); assert((Measure_difference<Measure<10,Unit::cm>, Measure<10,Unit::km>>::value()) == 1000 * 1000); } void testMeasureAdd(){ Measure_add<Measure<10,Unit::cm>, Measure<10,Unit::cm>>::value(); } int main() { testMeasuresSame(); testSmallestUnit(); testMeasureDifference(); testMeasureAdd(); return 0; } 行时,我收到以下错误:

Measure_add<Measure<10,Unit::cm>, Measure<10,Unit::cm>>::value();

我想从Measure_add特征返回一个带有结果的Measure。我真的不明白为什么我不能像这样使用差异。而且,我不确定我是否正确地返回了像这样的测量特征。 非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

仔细查看错误消息:

  

/unitconverter.cxx:78:63:错误:无法将‘Measure<20, (Unit)2>()’‘Measure<20, (Unit)2>’转换为‘const Measure<10, (Unit)2>'                return Measure<(M1::value + M2::value), M1::unit>();

问题发生在下面的行(和类似的)

static const M1 value(){
    if(Measures_same<M1,M2>::value()){
        return Measure<(M1::value + M2::value), M1::unit>();
    }
    ...

在您的情况下,值和单位都是模板类型。当您添加M1::valueM2::value时,您正在更改(其中一个)模板参数,并且类型可能与M1不同,除非M2::value0