我有一个项类,它实际上是一个int的包装器。我有一个模板化的节点类。我将项类作为模板参数传递给它。
我想创建一个模板化节点类的数组,但编译器不喜欢。当我使用相同的语法创建一个对象时,它就起作用了。为什么它不能推导数组元素来初始化模板类的数组?创建模板化类的对象数组的正确方法是什么?
这是项类,它是int
的包装器。
using namespace std;
class bItem {
private :
int item{INT_MIN};
public:
bItem() : item(INT_MIN) {}
bItem(int val) : item(val) {}
int getItem() { return item; }
bItem operator==(const bItem& val) {
return item == val.item;
}
bItem operator>(const bItem& val) {
return item > val.item;
}
bItem operator<(const bItem& val) {
return item < val.item;
}
friend ostream& operator<<(ostream& os, const bItem& item) {
os << "value:" << item.item << endl;
return os;
}
};
这是模板化的节点类
#include <iostream>
using namespace std;
template<class itemType>
class bNode {
itemType item{};
bNode* prev{};
bNode* next{};
public:
bNode() : item(), prev(nullptr), next(nullptr) {}
bNode(itemType _item) : item(_item), prev(nullptr), next(nullptr) {}
~bNode() {
delete prev;
delete next;
}
friend ostream& operator<<(ostream& os, const bNode& node) {
os << "node " << node.item<< endl;
return os;
}
};
这就是main()
int main()
{
bNode<bItem> nodes[5]{ 1,2,3,4,5 }; //this does not compile
bNode<bItem> node2(6); //this compiles ok
}
这是错误信息
error C2440: 'initializing': cannot convert from 'int' to 'bNode<bItem>'
message : No constructor could take the source type, or constructor overload resolution was ambiguous
在数组的聚合初始化中,元素是从初始值设定项列表的相应子句中复制初始化的。这意味着bNode<bItem>
类型的元素需要从int
进行复制初始化,这需要两个用户定义的隐式转换,即从int
到bItem
和从bItem
到bNode
,这是不允许的。
每个
direct public base, (since C++17)
数组元素或非静态类成员(按类定义中数组下标/出现的顺序(都是从初始值设定项列表的相应子句复制初始化的。
作为变通方法,您可以对隐式转换的时间施加限制,例如
bNode<bItem> nodes[5] = { bItem(1),bItem(2),bItem(3),bItem(4),bItem(5) };
或者,您可以添加另一个使用int
到bNode
的构造函数,然后它也可以从int
复制初始化。
// forward it to bNode::bNode(itemType)
bNode(int val) : bNode(itemType(val)) {}
BTW:bNode<bItem> node2(6);
执行直接初始化,只需要一次隐式转换(从int
到bItem
(,转换后的bItme
传递给bNode
的构造函数来构造node2
。它不存在复制初始化这样的问题。(像bNode<bItem> node2 = 6;
这样的复制初始化也不起作用。(
此外,复制初始化中的隐式转换必须直接从初始值设定项生成T,而例如,直接初始化需要从初始值设置项隐式转换为T的构造函数的参数。