Betrachten Sie den folgenden Code ein:Kann ein Freund von A <T> auch ein Freund von A <A<T>> sein?
#include <vector>
template<typename T> class Container;
template<typename T> Container<Container<T>> make_double_container(const std::vector<std::vector<T>>&);
template<typename T>
class Container {
std::vector<T> v;
friend Container<Container<T>> make_double_container<T>(const std::vector<std::vector<T>>&);
public:
Container() {}
explicit Container(std::vector<T> v) : v(v) {}
};
template<typename T>
Container<Container<T>> make_double_container(const std::vector<std::vector<T>>& v) {
Container<Container<T>> c;
for(const auto& x : v) {
c.v.push_back(Container<T>(x));
}
return c;
}
int main() {
std::vector<std::vector<int>> v{{1,2,3},{4,5,6}};
auto c = make_double_container(v);
return 0;
}
Der Compiler sagt mir, dass:
main.cpp: In instantiation of 'Container<Container<T> > make_double_container(const std::vector<std::vector<T> >&) [with T = int]':
main.cpp:27:37: required from here
main.cpp:8:20: error: 'std::vector<Container<int>, std::allocator<Container<int> > > Container<Container<int> >::v' is private
std::vector<T> v;
^
main.cpp:20:9: error: within this context
c.v.push_back(Container<T>(x));
die ich glaube, richtig zu sein, weil make_double_container
ist der Freund von Container<T>
, aber nicht von Container<Container<T>>
. Wie kann ich make_double_container
in dieser Situation arbeiten lassen?
Frage ist theoretisch interessant. Aber Vektoren von Vektoren sind, irgendwie, böse, so dass es meistens den Zweck verfehlt. – Drop