, как вы сделали это не может работать, для n
должны быть известны во время компиляции.
Вы можете сделать это параметром шаблона конструктора. К сожалению, в этом случае он не может быть явно задан и должен быть выводимым. Это вопрос уродливого синтаксиса, который работает в любом случае.
вытекает минимальный, рабочий пример:
#include<type_traits>
struct BaseNode {};
template<int n>
struct Node: BaseNode {};
struct Tree {
template<int n>
Tree(std::integral_constant<int, n>)
: n{n}, root{new Node<n>()}
{}
int n;
BaseNode *root;
};
int main() {
Tree tree{std::integral_constant<int, 2>{}};
}
Обратите внимание, что вы можете легко работать вокруг уродливого синтаксиса с фабричным методом:
struct Tree {
template<int n>
Tree(std::integral_constant<int, n>)
: n{n}, root{new Node<n>()}
{}
template<int n>
static Tree create() {
return Tree{std::integral_constant<int, n>{}};
}
int n;
BaseNode *root;
};
// ...
Tree tree = Tree::create<2>();
Другим возможным решением является создание Node
в качестве аргумента и вывести из него n
:
struct Tree {
template<int n>
Tree(Node<n> *node)
: n{n}, root{node}
{}
// ...
};
Или использовать инициализацию два шага и быть ABL е явно передать ваш n
в качестве параметра шаблона:
struct Tree {
Tree(): n{0}, root{nullptr} {}
template<int n>
void init() {
this->n = n;
root = Node<n>;
}
int n;
BaseNode *root;
};
// ...
Tree tree{};
tree.init<2>();
Компилятор собирается должны знать, что 'n' это заранее. Как вы собираетесь ожидать, что он создаст правильный шаблон, если он будет установлен только в отдаленном будущем? «Не постоянное выражение» - это то, что вам нужно отнять. Короткий ответ: вы не можете. Длинный ответ предполагает знание того, что «Node» делает с «n». – tadman
Вы не можете «передать» 'n' вашему классу Node, потому что параметры шаблона не передаются в шаблоны, способ передачи функционального параметра функции. Шаблон и функция - это принципиально разные вещи. C++ просто так не работает. –
шаблоны работают только со значениями, которые известны во время компиляции. 'n' не знает внутри' Tree: Tree' до времени выполнения. Поэтому его нельзя использовать с шаблоном. Вам нужно будет сделать «Tree» сам шаблон и передать 'n' в качестве параметра шаблона. –