2012-08-17 133 views
5

假設我用模板構造函數編寫模板類,就像那樣。模板類中的模板構造函數必須在類定義中定義?

template<typename T> 
class X{ 


    template<typename S> 
    X(X<S> x){} 
}; 

編譯得很好。然而,當我嘗試定義模板聲明之外的構造,就像這樣:

template<typename T> 
class X{ 


    template<typename S> 
    X(X<S> x); 
}; 


template<typename T, typename S> 
X<T>::X(X<S> y){} 

我收到以下錯誤:

error: invalid use of incomplete type ‘class X<T>’ 

爲什麼呢?是不是可以在類聲明之外定義一個模板類的模板構造函數?

回答

10

你有模板兩個層次,並有單獨指定。

template<typename T> 
template<typename S> 
X<T>::X(X<S> y){} 
5

試試這個:

template<typename T> 
template<typename S> 
X<T>::X()(X<S> y) 
{ 
} 
4

你的類有一個模板參數,你基本上是有它裏面的模板功能,所以你需要

template<typename T> 
template <typename S> 
X<T>::X(X<S> y){}