0

我们有一个模板类,其中包含另一个类,该类包含带有参数化构造函数的模板对象。

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
4

0 回答 0