テンプレート化されたクラスの変数からベクトルイテレータをどのように返しますか?

StackOverflow https://stackoverflow.com/questions/425430

  •  06-07-2019
  •  | 
  •  

質問

テンプレートクラスのベクトルのイテレータを返そうとしています(違いがあるかどうかはわかりませんが、読んだことがあるので、言及したいと思いました)。問題は、これをしようとすると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   

編集:
終了山括弧を変更して、それらが互いに接近しないようにしました-同じエラー。

なぜこれが起こっているのかについての考えは?
いつものように、事前にアドバイス/ヘルプをありがとう!

役に立ちましたか?

解決

また、テンプレートに依存する戻り値の型を宣言するときにtypenameを使用することを忘れないでください:

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

およびメソッド定義

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

また、クラス定義の外でテンプレートクラスメソッドを定義する場合は、テンプレートキーワードを使用する必要があることに注意してください。

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

コンパイラがTが何であるかを知ることができるように。

他のヒント

この部分はこちら:

vector<shared_ptr<vector<T>>>

これは、配置できないC ++構文の問題です&gt;&gt;一緒にそのように。

vector<shared_ptr<vector<T> > >

これは、新しい標準で対処されている問題です。

レクサーはコンパイラの最初のステージであるため、&gt;&gt;&gt;左シフト演算子の後に&gt;が続きます。したがって、コードで構文エラーが発生します。この問題を抑制するには、&gt;の間に空白を追加するだけです。テンプレートを閉じるとき。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top