0

我有一個模板類,需要一個專門的構造函數時,模板參數是類相同的類。下面的代碼不會編譯。嵌套模板專業

當類型爲Dual時,指定使用特定構造函數的正確語法是什麼?特別是,當模板參數的類型爲Dual時,我需要在初始化程序列表中初始化成員'real',但當它不是時(例如,輸入double),則不需要初始化成員'real'。

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); 

} 
+0

相關但不是直接原因:您沒有默認的構造函數。你如何處理沒有默認構造函數的類型的默認構造,就像你在嵌套聲明中一樣? –

+0

這就是我試圖用專業化解決的問題。類型X是一個雙重的,它需要調用1參數的構造函數或其某些浮點類型,在這種情況下它不會(稍後分配值)。 –

+0

這應該是顯而易見的:將一個默認的構造函數添加到你的'Dual'類中。 –

回答

1

你可以提供你的構造與可選的第二個參數進行初始化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)) {} 
0

您不能提供非類型模板的部分專業化,其中包括您的構造函數。

+0

你能說說爲什麼構造函數是一個非類型的模板嗎? –

+0

@ BenJones:構造函數不是類型。你只能部分專門化類型。另一方面,您可以完全專注於模板的功能成員,但它必須是完全專業化的。在你的情況下,你正試圖部分專門化'Dual '的構造函數(對於任何'X')。 –