复制构造函数中的模板

template in copy constructor

本文关键字:构造函数 复制      更新时间:2023-10-16

你能告诉我为什么我会得到编译错误吗

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)
    {
    }
template <class T>
Node<T>::Node(T value):_value(value)
{
}

试试这个。

当您编写时

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

类上没有模板参数(该行的第一个Node),但构造函数上有一个模板参数(第二个Node)。这是不正确的。

在您的例子中,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)
{
};

但它失败了。Clang打印此错误:

不允许函数模板部分专业化

对于您不需要的功能,您必须编写

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);