2015-11-02 135 views
0

你能告訴我,爲什麼我得到的編譯錯誤模板拷貝構造函數

template<class T> class 'Node' used without template parameters 

用下面的代碼

template<class T> 
    class Node 
    { 
     private: 
      T _value; 
      vector<Node*> children; 

     public: 
      Node(T value); 
      Node<T>(const Node<T>& node); 
      void AddChild(Node<T>* node); 
      T getValue(); 
      vector<Node<T>*> returnChildren(); 
      ~Node(); 
    }; 

    template <class T> 
    Node::Node<T>(T value):_value(value) 
    { 
    } 

回答

0

當你寫

Node::Node<T>(T value):_value(value) 

你有沒有該類上的模板參數(該行上的第一個Node),而是在構造函數上有一個(sec ond Node)。這是不正確的。

+0

如果我這樣做'模板 節點 ::節點(T值):_值(值) { }' 它不工作,要麼 –

+0

正如我所說的,第二個'節點'在該行中是構造函數的名稱,而不是類的名稱。你聲明構造函數的方式不是作爲模板。 (該類是一個模板,但構造函數是模板類的非模板函數)。所以構造函數名稱不應該有模板參數。 – JSF

1
template <class T> 
Node<T>::Node(T value):_value(value) 
{ 
} 

試試這個吧。

+0

工作!謝謝!我什麼時候知道在哪裏把T用在這個例子上?有沒有規則? –

+0

當'節點'表示類型而不是構造函數。 – iDingDong

0

就你而言,Node是模板類。當您使用該類時,您必須將其與模板參數一起使用。這不起作用:

template <class T> 
Node::Node(T value):_value(value) 
{ 
} 

因爲類Node是模板和你不需要使用模板參數。

這不起作用,因爲您將模板參數放在函數(這裏是構造函數)而不是類。

template <class T> 
Node::Node<T>(T value):_value(value) 
{ 
} 

這是行不通的。

template <class T> 
Node<T>::Node(T value):_value(value) 
{ 
} 

您只對該類使用此語法,它在寫函數時有所不同。

用於功能。
比方說,我們有這個類

class MyTemplate 
{ 
    template<typename T> 
    void foo(T val); 
}; 

可以定義的方式類似:

template<typename T> 
void MyTemplate::foo<T>(T val) 
{ 

}; 

但它失敗。鏘打印此錯誤:

函數模板部分特例是不允許

對於功能,你不需要它,你必須寫

template<typename T> 
void MyTemplate::foo(T val) 
{ 
} 

如果你想專注它,你可以寫

template<> 
void MyTemplate::foo(int val) 
{ 
} 

template<> 
void MyTemplate::foo<int>(int val) 
{ 
} 

聲明:

在聲明Node類型的變量,你必須使用模板參數太多。

Node<int> myNode(12);