2016-04-26 92 views
0

我有模板函数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

在'类A'加上'A()=默认;'在'公共'部分。 –

+0

@πάνταῥεῖ但它会使用'A(int y)'构造函数吗? –

+0

@πάνταῥεῖ我不需要'C++ 11' –

回答

3

你不能像你试图传递一个构造函数作为参数。 C++标准非常严格,不允许构造函数的内存地址。

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

为了使这一工作,你需要创建一个单独的函数,构造A对象,然后传递函数change(),如:

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

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