带有两个模板参数的C ++模板容器,存储在模板类的字段中

时间:2017-05-17 02:10:17

标签: c++ templates containers

template<class TNodeValue>
struct Node
{
    Node* next;
    TNodeValue value; //need to store here TPair<typename Tkey, typename Tvalue>. Got C2512 error: no appropriate default consturctor available.
    Node();
    Node(TNodeValue _value);
};
template<typename TNodeValue>
Node<TNodeValue>::Node()
{
    next = NULL;
    value = NULL;
}
template<typename TNodeValue>
Node<TNodeValue>::Node(TNodeValue _value)
{
    next = NULL;
    value = _value;
}

TPair代码:

template <typename Tkey, typename Tvalue>
struct TPair
{
    Tkey key;
    Tvalue value;

    TPair(Tkey _key, Tvalue _value)
    {
        key = _key;
        value = _value;
    }

};

调用错误的代码:

TPair<int, int> a(1, 2);
Node<TPair<int, int> > node(a);

问题是为什么不存储?为什么TNodeValue无法存储像TPair这样的东西?得到了C2512错误。 重要提示:请勿使用std lib。

1 个答案:

答案 0 :(得分:1)

TPair<int, int>没有默认构造函数,因此Node<TPair<int, int>>构造函数格式不正确,因为它们都试图调用此类型的默认构造函数。

由于你没有用于构造Node成员的构造函数参数,因此有value默认构造函数的节点,但是另一个构造函数应该使用初始化列表来构造value }:

// From C++11 and on, do this:
template<typename TNodeValue>
Node<TNodeValue>::Node(TNodeValue && _value)
    : next(nullptr), value(std::forward(_value)) { }

// Before C++11, do this:
template<typename TNodeValue>
Node<TNodeValue>::Node(TNodeValue const &_value)
    : next(0), value(_value) { }

即使您有value = _value;,由于您不使用初始值设定项列表,因此代码要求value成员的默认构造,然后是value的复制分配来自_value - 由于value的类型没有默认构造函数,因此Node构造函数无法实例化。

您还可以考虑向TPair添加默认构造函数。