2016-04-26 4 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() = по умолчанию ; 'в разделе' public'. –

+0

@ πάνταῥεῖ, но будет ли он использовать конструктор 'A (int y)'? –

+0

@ πάνταῥεῖ Мне нужно без 'C++ 11' –

ответ

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; 
} 
Смежные вопросы