Вложенный шаблон специализации
У меня есть шаблонный класс, который нуждается в специализированном конструкторе, когда параметры шаблона того же типа, что и класс. Код ниже не скомпилируется.
Каков правильный синтаксис для указания использования определенного конструктора, когда тип имеет тип Dual? В частности, мне нужно инициализировать элемент 'real' в списке инициализаторов, когда параметр шаблона имеет тип Dual, но не когда его нет (например, тип 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);
}
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) {}
Теперь, когда у вас есть специальные Dual
Вы можете инициализировать его так, как хотите, передав "прототип".
Dual<double> a(5);
Dual< Dual<double> > b(5, a);
Преимущество заключается в том, что вам нужно только 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)) {}
Вы не можете предоставить частичную специализацию нетипового шаблона, который включает ваш конструктор.