我在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。我真的不明白为什么我不能像这样使用差异。而且,我不确定我是否正确地返回了像这样的测量特征。 非常感谢任何帮助!
答案 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::value
和M2::value
时,您正在更改(其中一个)模板参数,并且类型可能与M1
不同,除非M2::value
为0
。