2011-11-16 147 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知道!你是对的 - 我一直认为这是错误的。编辑。 –