2012-10-15 61 views
0

我有以下的代碼:C++使用結交類的類型作爲模板參數聲明STL矢量

template <typename T> 
class A { 
    friend class B; 
    struct model_struct { 
     [...] 
    } 
} 

template <typename T> 
class B { 
    func { 
     typename vector<A<T>::model_struct > myVec; 
    } 
} 

矢量聲明是給我以下編譯錯誤:

錯誤:類型/值在參數1模板參數列表 '模板類的std :: vector' 的

錯誤不匹配:預期的類型,有 'ObjectExtraction :: model_struct'

有什麼想法?

+2

什麼是'func'應該是什麼? – Praetorian

+0

您有沒有嘗試過在'A :: model_struct'之前放置_typename_? – jplot

回答

1

三樣東西似乎丟失:

  • 分號在類定義年底
  • 在友元聲明模板參數
  • typename符在vector聲明

後者是導致錯誤的問題。

我不確定B的定義中的func {...}是幹什麼的;你可能想考慮刪除它。

最後,您需要對B模板進行前向聲明,以便您可以將其用於A中的朋友聲明。

這裏是糾正代碼的企圖:

template <typename T> 
class B; // Forward-declaration 

template <typename T> 
class A { 
    friend class B<T>; // template argument added 
    struct model_struct { 
     /*...*/ 
    }; // added semicolon 
}; // semicolon added 

template <typename T> 
class B { 
    /* Removed 'func'. */ 
    typename vector<typename A<T>::model_struct > myVec; // 'typename' added 
}; 
+0

所以把矢量聲明中的typename固定它。在矢量之前我還需要typename嗎? – Mustafa

+0

@Mustafa不,你可以刪除那個。 – jogojapan

+1

非常感謝你,我確實需要前向聲明來修復出現的另一個錯誤。 – Mustafa

1

您應修改如下:

template <typename T> 
class A { 
    friend class B; 
    struct model_struct { 
     [...] 
    } 
} 

template <typename T> 
class B { 
    func { 
     vector<typename A<T>::model_struct > myVec; 
    } 
} 
+0

由於'friend'聲明中缺少模板參數,並且缺少分號(除了問題註釋中提到的'func'問題),所以無法編譯。 – jogojapan

+0

是的,你是對的。 – bbg