2015-11-02 133 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);