gpt4 book ai didi

c++ - 如何为具有嵌套私有(private)类集合的类正确重载运算符<<?

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:53 24 4
gpt4 key购买 nike

我想实现 operator<<对于我的模板类,以便它可以将它包含的所有元素打印到给定的 std::ostream& .问题是我似乎无法让它识别我定义的函数。

我得到的错误是

error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'Outer<int>::Inner')
os << inner << ", ";
~~~^~~~~~~~

理想情况下,我不希望内联定义函数,但我什至不能让它内联工作。在下面的代码中,您可以看到我已经注释掉了我在类声明之外定义它的尝试。它会产生与上述相同的错误。

This question建议让运算符(operator)成为类(class)的 friend 。我用了我能想到的所有方法,但仍然不起作用。

代码:

#include <iostream>

template<class T>
class Outer {
class Inner {
T item;
template<class T_>
friend std::ostream& operator<<(std::ostream& os, const typename Outer<T_>::Inner& inner) {
os << inner.item;
return os;
}
template<class T_>
friend std::ostream& operator<<(std::ostream& os, const Outer<T_> outer);
};
std::vector<Inner> inner_items;
template<class T_>
friend std::ostream& operator<<(std::ostream& os, const Outer<T_> outer);
template<class T_>
friend std::ostream& operator<<(std::ostream& os, const typename Outer<T_>::Inner& bar);

};

/*template<class T>
std::ostream& operator<<(std::ostream& os, const typename Outer<T>::Inner& bar) {
os << inner.item;
return os;
}*/

template<class T>
std::ostream& operator<<(std::ostream& os, const Outer<T> outer) {
for (typename Outer<T>::Inner inner : outer.inner_items) {
os << inner << ", ";
}
return os;
}


int main()
{
Outer<int> outer;
std::cout << outer;
}

最佳答案

不要为嵌套类型模板创建输出运算符:

#include <iostream>
#include <vector>

template<class T>
class Outer {
class Inner {
T item;
friend std::ostream& operator<<(std::ostream& os, typename Outer<T>::Inner const& inner) {
os << inner.item;
return os;
}
friend std::ostream& operator<<(std::ostream& os, const Outer<T> outer);
};
template <typename T_>
friend std::ostream& operator<< (std::ostream&, Outer<T_> const&);
std::vector<Inner> inner_items;
};

template<class T>
std::ostream& operator<<(std::ostream& os, Outer<T> const& outer) {
for (typename Outer<T>::Inner const& inner : outer.inner_items) {
os << inner << ", ";
}
return os;
}

int main()
{
Outer<int> outer;
std::cout << outer;
}

还添加了一些 const& 和必要的 friend 声明。

关于c++ - 如何为具有嵌套私有(private)类集合的类正确重载运算符<<?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40554680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com