c ++编译错误

时间:2009-06-26 05:32:27

标签: c++ visual-studio templates

以下代码在visual studio 2009中给出了编译错误。

#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

2 个答案:

答案 0 :(得分: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);
};

答案 1 :(得分:0)

你需要typedef,而不是typename