2009-06-26 161 views
0

下面的代码是给编译错误在Visual Studio 2009年C++编译错误

#include <iterator> 
#include <vector> 

template <class T1, class T2 > 
class A 
{ 
public: 

    typename std::vector<std::pair<T1,T2> >::iterator iterator; 
    std::pair<iterator, bool > foo(const std::pair<T1 ,T2> &value_in); 
}; 

任何人都可以扔在这一些轻?这是错误。

error C2327: 'A<T1,T2>::iterator' : is not a type name, static, or enumerator 

回答

9

这声明iterator是一个变量(而不是类型):

typename std::vector<std::pair<T1,T2> >::iterator iterator; 

你说这个?

typedef typename std::vector<std::pair<T1,T2> >::iterator iterator; 

更多信息:如果您想了解什么typename呢,读了关于dependent和非依赖名之间的差别。如果您的类型与特定容器密切相关,那么该容器的typedef可能很有用,因为STL模式使用了许多可以轻松访问的嵌套typedef(下面的V::value_type)。这还有一个好处,就是随着代码的发展需要更少的更改,例如,使用不同的分配器(第二个模板参数),只需要一次编辑。

template<class T1, class T2> 
struct A { 
private: 
    // you may or may not want to expose these convenience types 
    typedef std::pair<T1, T2> P; 
    typedef std::vector<P> V; 

public: 
    typedef typename V::value_type value_type; 
    typedef typename V::iterator iterator; 
    std::pair<iterator, bool> foo(value_type const& value_in); 
}; 
0

你需要的typedef,不是类型名