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 に答える