3

このクラス:

template <class T>
struct A {
  A() : t(T()) {
  } 

  A(const T& t_) : t(t_) {
  }

  T t;
};

T にデフォルトのコンストラクターがない場合はコンパイルされません。これです:

template <class T>
struct A {
  A(const T& t_) : t(t_) {
  }

  T t;
};

T にデフォルトのコンストラクターがあっても、デフォルトのコンストラクターはありません。

両方が欲しい - T() がない場合、A() は必要ありません。

SFINAE を使用する必要があることはわかっています。Boost.traits と Boost.enable_if は役に立ちますが、うまくいきません。誰かがこの単純なケースの例を教えてもらえますか?

4

2 に答える 2

1

クラス テンプレートのメンバー関数は、呼び出した場合にのみインスタンス化されます。を決して呼び出さない場合はA::A()、呼び出すコードを次のコードT::T()でコンパイルしないでください。

template <class T>
struct A {
  A() : t(T()) {
  }
  // ...
};

これでお困りですか?もしそうなら、どのコンパイラを使用していますか?

とは言っても、使用しているコードAがそのデフォルトのコンストラクターを呼び出す場合、私が見る唯一の方法は、内部の作成をいくつかの特性クラスに移動することTですA::A()

template< typename T >
struct default_a_ traits {
  static T default_construct()
  {
    return T();
  }
};

template <class T, class Traits = default_a_traits<T> >
struct A {
  A() : t(Traits::default_construct()) {
  }
  // ...
};

Tデフォルトのコンストラクターを持たないクラスの場合、別の方法で作成する手段を提供するいくつかの特性クラスを提供できます。

struct my_special_traits_for_b {
  static T default_construct()
  {
    return read_b_from_db();
  }
};

typedef A<B, special_traits_for_b> AB;
于 2009-11-03T07:34:55.430 に答える
0

これを試して:

template <class T>
struct A {
  A(const T& t_ = T()) : t(t_) {
  }

  T t;
};
于 2009-10-30T21:35:24.727 に答える