1

我正在尝试为模板类中的向量返回一个迭代器(我不确定这是否会有所不同,但我已经读过它,所以我想我会提到它)。问题是当我尝试这个时,我得到一个关于 C++ 不支持 default-int 的错误。我在网上看过,从我在论坛和解释中看到的,我不认为我离得那么远,它只是无法编译。

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   

编辑:
更改了末端尖括号,使它们不那么靠近 - 同样的错误。

关于为什么会发生这种情况的任何想法?
与往常一样,提前感谢您的建议/帮助!

4

2 回答 2

4

还记得在声明依赖于模板的返回类型时使用 typename:

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();
    }

这样编译器就可以知道 T 是关于什么的。

于 2009-01-08T19:07:35.817 回答
3

这部分在这里:

vector<shared_ptr<vector<T>>>

这是 C++ 语法的问题,您不能像这样将 >> 放在一起。

vector<shared_ptr<vector<T> > >

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

因为词法分析器是编译器的第一阶段,所以它将 >>> 视为左移运算符,后跟 >。因此,您的代码中会出现语法错误。要解决此问题,您只需要在关闭模板时在 > 之间添加空格。

于 2009-01-08T19:02:39.993 回答