2016-04-26 17 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(追加)=デフォルト; '' public'セクションで。 –

+0

@πάνταῥεῖしかし、 'A(int y)'コンストラクタを使用しますか? –

+0

@πάνταῥε '私は' C++ 11 'なしで必要です –

答えて

3

試行しているように、パラメータとしてコンストラクタを渡すことはできません。 C++標準は、コンストラクタのメモリアドレスが取られないようにすることに対して非常に厳格です。

あなたがchange(88, A())を呼び出す

、あなたが実際に(コンパイラがデフォルトコンストラクタを持っていない Aので、許してはならない)一時 Aオブジェクトを構築していると、あなたは change()のパラメータにそのオブジェクトを渡しています。コンパイラは Aオブジェクトで呼び出されたとき Afunc(y)への呼び出しを満たすために operator()(int)を定義していないので、文句を言うのは正しいです。

、この作業を行うには、あなたが例えば、Aオブジェクトを作成し、別の関数を作成し、次にchange()にその関数を渡す必要があります:クラスA` `で

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

int main(void) { 
    B b(7); 
    b.change(88, createA); 
    return 0; 
} 
関連する問題