2017-02-15 85 views
3

我有一個模板節點類,它需要一個整型參數。我也有一個樹類,它創建一個節點並將其構造函數參數作爲節點模板的參數傳遞。傳遞一個變量作爲模板參數

Tree.cpp

Tree::Tree(int n) { 
    this->n = n; 
    root = new Node<n>(); // compiler error 
} 

的main.cpp

Tree *tree = new Tree(2); 

我的編譯器抱怨「n」是不是一個常量表達式。我如何成功地將n傳遞給我的節點類?

+1

編譯器將需要知道什麼'n'事先。如果它只在遙遠的未來得到解決,你會如何期望它實例化正確的模板? 「不是一個持續的表達」就是你需要從中脫離出來的。簡答:你不能。很長的回答就是要知道'Node'在做什麼'n'。 – tadman

+1

您不能將'n'傳遞給您的Node類,因爲模板參數不會傳遞給模板,這是函數參數傳遞給函數的方式。模板和函數是根本不同的東西。 C++根本不能這樣工作。 –

+0

模板僅適用於編譯時已知的值。 「樹:樹」內的'n'不知道直到運行時。因此它不能用於模板。你必須使'Tree'本身成爲一個模板並將'n'作爲模板參數。 –

回答

0

我不認爲你可以這樣做。

n在編譯時已知,但它不被稱爲模板參數。由於您的Tree構造函數中需要n,因此您也可以使Tree類成爲模板。

0

讓您的構造模板之一:

struct Base 
{ 

}; 
template <int N> 
struct Node : Base 
{ 

}; 

class Tree 
{ 
public: 

    template <int N> 
    struct size 
    { 
    }; 

    template<int N> Tree(size<N>) { 
     this->n = N; 
     root = new Node<N>(); 
    } 

    int n; 
    Base* root; 
}; 

int main() { 

    Tree t = Tree(Tree::size<2>()); 

    return 0; 
} 
+1

你將如何調用這樣的構造函數?必須扣除'n'。 – skypjack

0

你沒有它不能正常工作,對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>(); 
相關問題