我们有一个模板类,其中包含另一个类,该类包含带有参数化构造函数的模板对象。
template<class T>
class A {
public:
class B {
public:
T object;
B(T obj) {
this->object = obj;
}
};
T foo(T obj) {
B *b = new B(obj);
return b->object;
}
};
此外,我们还有一类我们想要作为 foo() 参数的对象:
class Item {
public:
int value;
// Item() {}
// Non-parameter constructor. Within works fine
Item(int value) {
this->value = value;
}
};
注意:在非参数构造函数
Item() {}
中代码运行完美,但由于某种原因构造函数总是运行一次而没有被显式调用。
在这里main()
打电话a.foo()
:
A<Item> a;
Item item(5);
cout << a.foo(item).value; //expected: 5
最终我们得到了这样的错误:
error: no matching function for call to 'Item::Item()'
B(T obj) {
^
问题:如何在没有非参数构造函数的情况下使具有这种结构的代码工作
Class Item {}
?
- 这种结构的原因是什么?
- 我对双向链表的实现进行了编码,并将此类错误从它简化为上面的代码。
提示:我想让代码在不改变
Class Item {}
定义的情况下工作,因为我是提供者Class A
并且我想特别解决这个案例。
解决了
使用成员初始化列表解决了错误。感谢乌尔里希·埃克哈特。
B(T obj) {
this->object = obj;
}
//wrong
B(T obj): object(obj) {}
//correct