我有一个结构模板A<x>
和一个与int
相加的+
运算符。
#include <iostream>
template<int x>
struct A{
int a;
};
template<int x>
int operator+(A<x> a, int b){
return a.a+b;
}
我创建了一个结构体模板
B<x>
,可以转换为 A<x>
。template<int x>
struct B{
int b=3;
operator A<x>(){
return {b+10};
}
};
现在我希望在调用
B<x> + int
时,将 B<x>
转换为 A<x>
。int main(){
std::cout<<(A<12>{9}+10)<<std::endl;//OK
std::cout<<(B<12>{9}+10)<<std::endl;//Error
return 0;
}
我阅读了 模板类重载运算符时的隐式转换,并撰写了以下内容:
template<int x>
struct B{
int b=3;
operator A<x>(){
return {b+10};
}
friend int operator+(A<x> a, int b);
};
我曾尝试使用 friend int operator+(A<x> a, int b)
声明来实现相关操作,但由于其与 template<int x> int operator+(A<x> a, int b)
不匹配,因此未能成功。
我阅读了 C++ - How to declare a function template friend for a class template 并添加了模板友元声明,但模板参数无法推断。
当然,我可以为 A 和 B 分别编写 operator+,但我有数十个运算符,而且不想这样做。
请问正确的解决方法是什么?
operator+
模板吗? - W.F.A
吗? - T.C.