在下面的代码中,我有一个带有成员类型(结构元素)的模板类。我想为成员类型重载operator <
如果有人可以指出我要去哪里错了,我将不胜感激。
include <iostream>
using namespace std;
// fwd decl
template<class T> class CC;
// operator<< overload template for member type CC<T>::Element
template<class T>
ostream& operator<<(ostream& os, const typename CC<T>::Element& elm) {
return os << elm.val1 << "/" << elm.val2;
}
template<class T>
class CC
{
public:
struct Element { // type member
int val1;
int val2;
};
template<typename U>
friend ostream& operator<<(ostream& os, const typename CC<U>::Element& elm);
};
int main() {
CC<int>::Element elm{0,0};
cout << elm << endl; // does not compile due to this!
}
最佳答案
不能从嵌套实体中推导出模板参数(简短的解释:对于不同的模板实例,类型可能是Seame)。也就是说,声明
template<typename U>
ostream& operator<<(ostream& os, const typename CC<U>::Element& elm);
永远不要考虑是否使用
friend
,因为无法推导U
类型。您可以通过将friend
运算符设置为非模板来解决此问题:// ...
friend ostream& operator<<(ostream& os, const Element& elm) { ... }
// or
friend ostream& operator<<(ostream& os, const CC<T>::Element& elm) { ... }
// ...
不过,该函数将需要在其声明中实现。