我从编译器得到以下错误:error: no match for 'operator+' (operand types are 'Expected<double>' and 'Expected<double>')
预期是一种类型或异常。如何在两个相同类型的模板上正确执行操作?
template<typename T>
class Expected
{
template<typename U>
Expected<U> apply(std::function<U(T)> f)
{
if(!valid) return std::get<std::exception_ptr>(state);
try
{
return f(std::get<T>(state));
}
catch(...)
{
return std::current_exception();
}
}
};
#define MixedMode(op)\
template<typename T, typename U, typename V>\
Expected<U> op(Expected<T> t, Expected<V> v)\
{\
return t.apply([&](T myT){return op(v,myT);});\
}\
template<typename T, typename U, typename V>\
Expected<U> op(Expected<T> t, V v)\
{\
return t.apply([&](T myT){return op(myT,v);});\
}\
\
template<typename T, typename U, typename V>\
Expected<U> op(V v, Expected<T> t)\
{\
return t.apply([&](T myT){return op(v,myT);});\
}\
MixedMode(operator+)
int main()
{
Expected<double> a;
Expected<double> b;
a + b;
}
我相信我的头文件我做的已经够让他们过载,并把它们相加。在第一个我期待两个模板添加在一起。在我的主文件中,我只是打电话:
Expected<double> a;
Expected<double> b;
std::cout << a + b << std::endl;
然后错误被抛出。在我添加Expected<U> op(Expected<T> t, Expected<V> v)\
部分代码之前,如果我有一个名为operator T() { return value(); }
的函数,它将隐式地将Expected<T>
转换为传入的任何类型,但我能够编译和运行。但是,我意识到我的apply
函数从未被使用。不仅如此,当我检查a+b
的类型时,我返回了double
而不是Expected<double>
,因此我取消了operator T()
函数,编译器通知我它不知道如何将两个Expected<T>
一起添加。
我该如何解决这个错误?我一整天都在殴打我。
你可以把它拍成[mcve]吗?例如,如果没有这个宏,它可能不起作用,你不需要在课堂上的所有东西。你可能会[击败它](https://ideone.com/cNcRpF),仍然会有相同的错误。为什么试验所有额外的噪音? – user4581301
@ user4581301我可以尝试将它打败成一个我将排除'operator <<'的最小例子,然后我意识到我需要它,所以没有人会自己写它。我可以只用你的吗? – Sailanarmo
@ user4581301我也有这个宏,因为我打算使用除'+ =, - =,='之外的所有运算符。所以我想我应该让它现在是它的样子。 – Sailanarmo