在下面的代码中,我有一个带有成员类型(结构元素)的模板类。我想为成员类型重载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) { ... }
// ...

不过,该函数将需要在其声明中实现。

10-08 11:28