2011-11-16 292 views
1

C++模板:模板參數錯誤

template <typename ConcContainer> 
    class WebBrowsingPolicyData 
    { 
    public: 
     typedef ConcContainer<std::shared_ptr<WBRuleDetails>>::iterator iterator; 
    ... 
    private: 
    ConcContainer<std::shared_ptr<WBRuleDetails>> usersData_; 
    CRITICAL_SECTION critSection 

我在行得到一個編譯錯誤(錯誤6錯誤C2238:意外的標記(S)之前 ';')

typedef ConcContainer<std::shared_ptr<WBRuleDetails>>::iterator iterator 

哪有我在模板中做一個typedef?我必須失去了一些東西..

+0

這看起來令人困惑:是'ConcContainer'類型名或模板? – aschepler

+0

ConcContainer實際上是一個模板,這就是爲什麼hmjd答案是有效的 – Ghita

回答

3

ConContainer本身就是一個模板,所以它需要一個模板,模板參數:

template <template <typename T> class ConcContainer> 
class WebBrowsingPolicyData 
{ 
public: 
    typedef typename ConcContainer<std::shared_ptr<WBRuleDetails>>::iterator iterator; 
}; 
+0

我認爲你是對的。 – Ghita

0

兩種可能性:

  1. 編譯器具有>>麻煩。插入一個空格。請注意,如果您使用的是C++ 11-conformant編譯器,則這不應該成爲問題。

例如:

typedef ConcContainer<std::shared_ptr<WBRuleDetails> >::iterator iterator; 
  1. ConcContainer不具有構件或typedef的iterator。檢查以確保它確實如此。

編輯:這不是最令人煩惱的解析。

+0

我有一致的編譯器VC 2010。我沒有在那裏實例化WebBrowsingPolicy ...所以必須是別的東西。 – Ghita

+0

很確定這不是最令人頭疼的解析:http://en.wikipedia.org/wiki/Most_vexing_parse – obmarg

+0

@obmarg:好吧,whadya知道!你是對的 - 我一直認爲這是錯誤的。編輯。 –