2

だから私はこのコードを持っていて、便宜上、そのコンストラクターのデフォルトパラメーターをint型で0にしたいのです.コンストラクターが大きいため、コンストラクターを 2 回記述します)

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&)
4

3 に答える 3

5

関数テンプレートでは、既定のテンプレート パラメーターは使用できないことに注意してください。クラス テンプレートを作成してみませんか?

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

int main(){
    mama<> x; // no argument based template parameter deduction possible
}
于 2009-05-06T21:57:08.733 に答える
3

コンストラクターをプライベート初期化関数とラッパー コンストラクターにリファクタリングし、次のようにデフォルトを追加します。

class mama {
  private:
    template<typename x> void init(x i) { /* ... */ }
  public:
    template<typename x> mama(x i) { init(i); }
    mama() { init((int)0); }
};
于 2009-05-06T21:56:49.763 に答える
-1

デフォルト値はオーバーロードと同じように機能するので...

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

引数なしで mama を作成すると、デフォルトの int を持つ構造が、テンプレート化されたコンストラクターの前に一致します。

于 2009-05-07T02:59:56.790 に答える