通过模板化类数组的参数推导进行隐式初始化



我有一个项类,它实际上是一个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进行复制初始化,这需要两个用户定义的隐式转换,即从intbItem和从bItembNode,这是不允许的。

每个direct public base, (since C++17)数组元素或非静态类成员(按类定义中数组下标/出现的顺序(都是从初始值设定项列表的相应子句复制初始化的。

作为变通方法,您可以对隐式转换的时间施加限制,例如

bNode<bItem> nodes[5] = { bItem(1),bItem(2),bItem(3),bItem(4),bItem(5) };

或者,您可以添加另一个使用intbNode的构造函数,然后它也可以从int复制初始化。

// forward it to bNode::bNode(itemType)
bNode(int val) : bNode(itemType(val)) {}

BTW:bNode<bItem> node2(6);执行直接初始化,只需要一次隐式转换(从intbItem(,转换后的bItme传递给bNode的构造函数来构造node2。它不存在复制初始化这样的问题。(像bNode<bItem> node2 = 6;这样的复制初始化也不起作用。(

此外,复制初始化中的隐式转换必须直接从初始值设定项生成T,而例如,直接初始化需要从初始值设置项隐式转换为T的构造函数的参数。

相关内容

  • 没有找到相关文章

最新更新