类 X 不能包含类 X 的实际实例的多个副本,但逻辑上除外。
如果我们有
struct X {
std::array<X, 2> data;
};
唯一可能的大小X
是无穷大,如sizeof(X)
= 2*sizeof(X)
,并且 C++ 中的所有类型都有sizeof(X)>=1
.
C++ 不支持无限大的类型。
您的第二个问题是类型实例不是模板。
template<typename T, template<typename> class Tuple>
class tree
这需要一个 typeT
和一个template
Tuple
. 第二个参数不是 type。
template<typename T, std::size_t N>
using static_tree = tree<T, std::array<T, N>>;
在这里,您的第二个参数是 type,而不是模板。
template<std::size_t N>
struct array_of_size {
template<class T>
using result=std::array<T,N>;
};
template<typename T, std::size_t N>
using static_tree = tree<T, array_of_size<N>::template result>;
除了上述“无限大小问题”之外,还能解决您的问题。在这里,我们将模板传递array_of_size<N>::result
给tree
.
要解决无限大小的问题,您必须在数组中存储指针(或等效的东西)。所以我们得到:
template<std::size_t N>
struct array_of_ups_of_size {
template<class T>
using result=std::array<std::unique_ptr<T>,N>;
};
template<typename T, std::size_t N>
using static_tree = tree<T, array_of_ups_of_size<N>::template result>;
现在你的 static_tree 有N
孩子,每个孩子都是unique_ptr
一个相似的static_tree
.
由于析构函数问题,这仍然不起作用。
template<typename T, template<typename> class Tuple>
class tree
{
private:
T m_value;
Tuple<tree> m_children;
public:
~tree();
};
template<typename T, template<typename> class Tuple>
tree<T,Tuple>::~tree() = default;
我认为以上解决了它,尽管看起来很奇怪。
基本上,当您制作子数组时,树类型是不完整的。在销毁时,调用删除。此时,树必须是完整的。通过推迟 dtor,我们有望解决这个问题。
我不确定模板是否需要这种技术,但它适用于非模板类。