代码之家  ›  专栏  ›  技术社区  ›  Fry

如何从模板类中的变量返回向量迭代器?

  •  1
  • Fry  · 技术社区  · 16 年前

    远远地说,它就是无法编译。

    template<class T>
    class Table
    {
    public:
      ...
    
      vector<shared_ptr<vector<T>>>::iterator GetRowIterator();
      //vector<shared_ptr<vector<CellValueType> > >::const_iterator GetRowIterator();
    
      ...
    protected:
    
      vector<shared_ptr<vector<CellValueType> > > data;  //outside vector is rows, inside vector is columns
    
      ...
    };
    
    vector<shared_ptr<vector<T> > >::const_iterator Table<T>::GetRowIterator()
    {
      return data.begin();
    }
    

    error C2146: syntax error : missing ';' before identifier 'GetRowIterator'
    
    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   
    

    编辑:


    有没有想过为什么会发生这种情况?
    一如既往,提前感谢您的建议/帮助!

    2 回复  |  直到 16 年前
        1
  •  4
  •   Fabio Ceconello    16 年前

    typename vector< shared_ptr< vector< T > > >::iterator GetRowIterator();
    

    以及方法定义

    typename vector< shared_ptr< vector< T > > >::const_iterator Table<T>::GetRowIterator()
    {
      return data.begin();
    }
    

    还要注意,在类定义之外定义模板类方法时,必须使用template关键字:

    template <class T> typename vector< shared_ptr< vector< T > > >::const_iterator Table<T>::GetRowIterator()
        {
          return data.begin();
        }
    

        2
  •  3
  •   Loki Astari    16 年前

    vector<shared_ptr<vector<T>>>
    

    这是一个C++语法无法解决的问题。燃气轮机;像那样在一起。

    vector<shared_ptr<vector<T> > >
    

    这是新标准正在解决的问题。

    因为lexer是编译器的第一阶段,所以它会看到>&燃气轮机&燃气轮机;作为左移操作员,后跟>。因此,代码中会出现语法错误。要解决此问题,只需在>关闭模板时。