我有模板函数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()’
我怎样才能使它有效?
答案 0 :(得分:3)
您无法像尝试那样将构造函数作为参数传递。 C ++标准非常严格,不允许采用构造函数的内存地址。
当你调用change(88, A())
时,你实际上构建了一个临时A
对象(编译器不应该允许,因为A
没有默认构造函数)然后你传递了对象change()
的参数。抱怨编译器是正确的,因为A
在operator()(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;
}