你沒有它不能正常工作,對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 e明確地通過你的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'本身成爲一個模板並將'n'作爲模板參數。 –