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。
答案 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
添加默认构造函数。