2016-04-26 94 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; 
} 
相關問題