Я пытаюсь создать древовидную структуру, в которой пользователь может сделать свой собственный узел дерева наследником, но узел инкапсулирует некоторый код для управления своим положением в дереве и предоставления потомков наследникам. У меня есть код, подобный этому:
template <typename TData>
class TreeBase {
protected:
struct TreeNode { // should be fully encapsulated
TData data;
...
};
public: ...
};
template <typename TNode>
struct Tree: public TreeBase<TNode> {
class Node {
typename TreeBase<TNode>::TreeNode _tn; // keep encapsulated
public: ...
};
...
static_assert(std::is_base_of<Node, TNode>::value, "TNode must be a descendant of NodeTrie::Node");
};
И хотя определения классов компилируются, я не могу понять, как их использовать. Я не могу сделать наследником Node, не помещая его в наследник Tree, и я не могу сделать наследником Tree, не передав свой тип узла. Это проблема курицы и яйца. Есть предложения?