2009-05-06 7 views
2

このコードはありますが、都合の良いことに、そのコンストラクタのデフォルトのパラメータをint kindと0にします。(プロジェクトのクラスとその中の1つのパラメータで、オプションで、私は二回、コンストラクタを記述する必要はありませんので、その大)コンストラクタ内のデフォルトのテンプレートパラメータ

class mama{ 
    public: 
    template<typename x> mama(x i=int(0)){} 
}; 

int main(){ 
    mama x; 
} 

それはそれは私がこれを行うことができ、別の方法があるので、コンストラクタを見つけることができないと言うので、これは動作しませんか?

error: no matching function for call to ‘mama::mama()' 
note: candidates are: mama::mama(const mama&) 

答えて

3

そうのように、デフォルトを追加し、民間の初期化関数とラッパーのコンストラクタにあなたのコンストラクタをリファクタリング:デフォルトのテンプレートパラメータは関数テンプレートのために許可されていないことを

class mama { 
    private: 
    template<typename x> void init(x i) { /* ... */ } 
    public: 
    template<typename x> mama(x i) { init(i); } 
    mama() { init((int)0); } 
}; 
+0

私たちはまったく同じコードで終わった。すっきり:) –

+0

あなたのctorがテンプレート化されているという事実は、私がクラス全体をテンプレート化するための強力なヒントです。 YMMV!おそらく; – dirkgently

+0

;私はこのようなテンプレートコンストラクタがクラスをテンプレート化せずにどのように役立つだろうと想像することはできませんが、これは元の質問に何を求めているのか、そして他の誰かがクラスをテンプレートにすることを扱っています:) – bdonlan

3

注意。なぜクラステンプレートを作成しないのですか?

template <class T=int> 
class mama{ 
    public: 
    mama<T>(T i=0){} 
}; 

int main(){ 
    mama<> x; // no argument based template parameter deduction possible 
} 
+0

私は同じことを考えました:) – pankajt

-1

デフォルト値を使用すると、引数なしでママを作成すると、デフォルトのint型を有する構築物は、任意のテンプレートコンストラクタの前に一致している...

class mama{ 
public: 
    template<typename x> mama(x i){} 
    mama(int i = 0) {} 
}; 

だけ過負荷のように動作しますので。

+0

はい、それはコードの重複を避けません。 Csizは単一のコンストラクタを必要としていました。 – Ari

+0

bdonlanが提案したように、コンストラクタ本体を2回書くことを避けたい場合は、それを関数に組み込みます。しかし、後でmama :: mama(int)を特殊化したい場合は、bdonlanのソリューション(intを持つコンストラクタの代わりに引数を持たないデフォルトのコンストラクタと0のデフォルトを持つ)を使用すると、別のコンストラクタを追加しなければできません。 –

関連する問題