0

テンプレートパラメータがクラスと同じタイプの場合、特殊なコンストラクタを必要とするテンプレートクラスがあります。以下のコードはコンパイルされません。

タイプがDualの場合に、特定のコンストラクターの使用を指定するための正しい構文は何ですか?特に、テンプレートパラメータがDual型の場合は、初期化子リストのメンバー'real'を初期化する必要がありますが、そうでない場合(たとえば、double型)は初期化できません。

template<class X> class Dual {
 public:
  X real;
  size_t N;
  std::vector<X> imag;//don't know N at compile time


  Dual(size_t _N);

};

template <class X>
inline Dual<X>::Dual(size_t _N):  N(_N), imag(N, 0.0)  {}

template <class X>
inline Dual<Dual<X> >::Dual(size_t _N): real(_N), N(_N), imag(_N, 0.0) {}
//syntax error:  
//error: cpptest.cpp:20:24: error: C++ requires a type specifier for all declarations
//inline Dual<Dual<X> >::Dual(size_t _N): real(_N), N(_N), imag(_N, 0.0) {}
//~~~~~~ 



int main(){

  Dual <double> a(5);
  Dual< Dual < double>> b(5);

}
4

2 に答える 2

1

コンストラクターに、初期化するためのオプションの 2 番目のパラメーターを指定できますreal

template<class X> class Dual {
public:
  X real;
  size_t N;
  std::vector<X> imag;
  Dual(size_t _N, X x = X());
};

template <class X>
inline Dual<X>::Dual(size_t _N, X x):  real(x), N(_N), imag(N, 0.0)  {}

これで、 specialDualができたら、「プロトタイプ」を渡すことで、必要な方法で初期化できます。

Dual<double> a(5);
Dual< Dual<double> > b(5, a);

利点は、宣言する必要があるのは 1 つだけであることですtemplate。ただし、 の特殊化を作成すると、Dual< Dual<X> >試したようにコンストラクターを定義できます (ただし、imag初期化が間違っていたため、以下で修正しました)。

// Specialize Dual<T> in the case T is a Dual<X>
template <class X> class Dual< Dual<X> > {
public:
    Dual<X> real;
    size_t N;
    std::vector< Dual<X> > imag;
    Dual(size_t _N);
};

template <class X>
inline Dual< Dual<X> >::Dual(size_t _N)
    : real(_N), N(_N), imag(N, Dual<X>(_N)) {}
于 2012-06-25T20:02:47.670 に答える
0

コンストラクターを含む非型テンプレートの部分的な特殊化を提供することはできません。

于 2012-06-25T20:17:01.300 に答える