以下非模板代码works well:
struct A { };
struct B
{
B() {}
B(const A&) {}
friend B operator+(const B&) { return B(); }
};
B operator+(const B&);
int main()
{
A a;
B b;
+b;
+a;
}
但是,如果我在这段代码中创建模板:
template <class T>
struct A { };
template <class T>
struct B
{
B() {}
B(const A<T>&) {}
friend B operator+(const B&) { return B(); }
};
template <class T>
B<T> operator+(const B<T>&); // not really what I want
int main()
{
A<int> a;
B<int> b;
+b;
+a;
}
错误:不匹配&#39;运营商+&#39; (操作数类型是&#39; A&lt; int&gt;&#39;)
是否可以为类外的模板类声明非模板友元函数(正如我上面的非模板类所做的那样)?
我可以通过为A<T>
参数添加template operator并在里面调用friend函数来解决问题,但这并不重要。
UPD:
另一种解决方法(受R Sahu's answer启发)是为类friend
添加A
声明:
template <class T>
struct A {
friend B<T> operator+(const B<T>&);
};
但gives a warning,我不知道如何正确修复它。
答案 0 :(得分:1)
是否可以为类外的模板类声明非模板友元函数(就像我上面的非模板类所做的那样)?
是的,有可能。但是,您可能还需要一个功能模板,并确保operator+<int>
是friend
A<int>
,operator+<double>
是friend
A<double>
1}}等等。
请参阅https://stackoverflow.com/a/35854179/434551了解如何做到这一点。
答案 1 :(得分:0)
是否可以在课堂外为模板类声明非模板友元函数?
答案:是的,但是......你需要为你使用的每个组合声明一个函数:
这个功能解决了你的声明问题:
A<int> operator+(const A<int>&) { return A<int>(); }
但是,如果你使用A&lt; double&gt;,你需要明确声明其他函数:
A<double> operator+(const A<double>&) { return A<double>(); }
不是好朋友,因为在结构中所有成员都是公开的