2011-06-01 192 views
2

我想實現C++以下幾點:如何使用類的模板參數作爲類成員的模板參數?

template <class T> 
class Inner 
{ 
public: 
    Inner(T inData){data = inData;}; 
    ~Inner(void){}; 

    T data; 
}; 

template <class T> 
class Outer 
{ 
public: 
    Outer(Inner<T> in){inner = in;}; 
    ~Outer(void){}; 

    Inner<T> inner; 
}; 

int main(void) 
{ 
    Inner<int> in (10); 
    Outer<int> out (in); 

    std::cout << out.inner.data; 
} 

在2010年MSVS編譯,我得到以下錯誤:

c:\...\main.cpp(15): error C2512: 'Inner<T>' : no appropriate default constructor available 
      with 
      [ 
       T=int 
      ] 
      c:\users\gaff\documents\visual studio 2010\projects\pgp(c++)\pgp(c++)\main.cpp(15) : while compiling class template member function 'Outer<T>::Outer(Inner<T>)' 
      with 
      [ 
       T=int 
      ] 
      c:\users\gaff\documents\visual studio 2010\projects\pgp(c++)\pgp(c++)\main.cpp(24) : see reference to class template instantiation 'Outer<T>' being compiled 
      with 
      [ 
       T=int 
      ] 

顯然,我在這裏缺少一些基本的瞭解,但我有沒有線索如何解決這個問題,或者即使我想要實現的是可能的。

對於它的價值,這裏是編譯沒有任何問題的Java實現:

public class Inner<T> { 
    public T data; 

    public Inner(T inData) { 
     data = inData; 
    } 
} 

public class Outer<T> { 

    public Inner<T> inner; 

    public Outer(Inner<T> in) { 
     inner = in; 
    } 
} 

public class Main { 
    public static void main(String args[]){ 
     Inner<Integer> in = new Inner<Integer>(10); 
     Outer<Integer> out = new Outer<Integer>(in); 

     System.out.println(out.inner.data); 
    } 
} 

有什麼建議?

乾杯

JimmidyJoo

回答

3

的問題是,你不必爲內部默認的構造函數。當編譯器初始化該對象時,它會在賦值之前調用inner的默認構造方法。

編輯:

這可能正確地實現一個拷貝構造函數,而是初始化內像這樣一個好主意:

Outer(Inner<T> in) : inner(in) { }; 

您可以使用拷貝構造函數,像這樣:

Inner(const Inner<T> & in) : data(in.data){ 
} 
+0

這不是一個複製構造函數。複製構造函數是'Outer(Outer const&)' – 2011-06-01 00:54:33

+0

@Neil G:我從來沒有說過它是一個拷貝構造函數,我說實現一個,然後使用它初始化內部元素。 – GWW 2011-06-01 00:55:20

+1

@GWW,啊,你是指Inner。但是,你會在這樣一個複製構造函數中放入什麼? Inner的默認拷貝構造函數應該沒問題。 T已經必須是可複製構造的,因爲構造函數按值取T。 – 2011-06-01 00:57:40

2

您需要在構造函數中使用初始化程序列表:

Outer(Inner<T> in): inner(in) {} 

否則構造函數在進入構造函數之前必須默認構造內部元素。這是不可能的,因爲沒有默認的構造函數。

+0

和一個拷貝構造函數 – littleadv 2011-06-01 00:54:10

+0

@littleadv:默認的拷貝構造函數沒問題,因爲T被保證是可複製的,因爲它是通過值傳遞的。 – 2011-06-01 00:58:02

+0

謝謝尼爾。 GWW的答覆被提名爲接受答案,因爲他提前3分鐘提交了答案。我注意到你對他的回答的評論。 – JimmidyJoo 2011-06-01 01:02:34

相關問題