代码之家  ›  专栏  ›  技术社区  ›  Shino C G

C++编译错误

  •  0
  • Shino C G  · 技术社区  · 17 年前

    以下代码在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 回复  |  直到 16 年前
        1
  •  9
  •   Roger Pate    16 年前

    这宣告 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 以下)。这还有一个额外的优点,即随着代码的发展,只需进行一次编辑,就可以使用不同的分配器(vector的第二个模板参数)。

    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);
    };
    
        2
  •  0
  •   J-16 SDiZ    17 年前

    你需要typedef,而不是typename