使用自定义构造函数作为模板函数

时间:2016-04-26 21:03:56

标签: c++ class templates constructor

我有模板函数change,它接受​​一个带int的函数并返回A类型的对象。所以我想我可以使用A

的构造函数
class A {
    int y;
public:
    explicit A(int y) : y(2 * y) {

    }
};

class B {
    A x;
public:
    B(int x) : x(x) {

    }

    template<typename F>
    void change(int y, F func) {
        x = func(y);
    }

};

int main(void) {
    B b(7);
    b.change(88, A());    // << here

    return 0;
}

但是编译器说no matching function for call to ‘A::A()’

我怎样才能使它有效?

1 个答案:

答案 0 :(得分:3)

您无法像尝试那样将构造函数作为参数传递。 C ++标准非常严格,不允许采用构造函数的内存地址。

当你调用change(88, A())时,你实际上构建了一个临时A对象(编译器不应该允许,因为A没有默认构造函数)然后你传递了对象change()的参数。抱怨编译器是正确的,因为Aoperator()(int)对象中调用时没有定义func(y)来满足对A的调用。

要使其工作,您需要创建一个单独的函数来构造A对象,然后将该函数传递给change(),例如:

A createA(int y)
{
    return A(y);
}

int main(void) {
    B b(7);
    b.change(88, createA);
    return 0;
}