我是C++初学者,请帮助我。
我不能使用模板类作为构造函数的参数。
xcode显示“没有匹配的构造函数,用于初始化”工作”错误。
下面的整个源代码,谁能解决这个问题?

#include <iostream>
class Base {
 public:
    virtual void hello_world() const {
        printf("Base::hello_world()\n");
    };
};

class Derived : public Base {
public:
    void hello_world() const {
        printf("Derived::hello_world()\n");
    };
};

template<class T>
class Templ {
public:
    Templ(const T &t) : _value(t) {}

    const T& getValue() const{
        return _value;
    }
private:
    const T &_value;
};

class Work {
public:
    Work(const Templ<Base*> &base) : mBase(base) {}

    void working() {
        mBase.getValue()->hello_world();
    }
private:
    const Templ<Base*> &mBase;
};

int main(int argc, const char * argv[]) {
    Templ<Base*> base(new Base());
    //OK
    Work w_base(base);

    Templ<Derived*> derived(new Derived());
    //error: No matching constructor for initialization of 'Work'
    Work w_derived(derived);

    return 0;
}

最佳答案

Work w_derived(derived);永远不会起作用,因为Work需要Templ<Base*>Templ<Base*>Templ<Derived*>是两种不同的不同类型。只是一个std::vector<int>std::vector<std::complex>不同。

但是,您可以做的是从指向Templ<Base*>的指针创建Dervied,然后使用该指针创建Work。就像是

Templ<Base*> derived(new Derived());
Work w_derived(derived);

Live Example

另外,正如注释中所指出的那样,由于您正在使用多态性,因此您需要在基类中具有虚拟析构函数。如果析构函数不是虚拟的,则仅基类析构函数将运行,并且您的对象将不会被正确地析构。

08-06 10:08