テンプレート化されたクラスの変数からベクトルイテレータをどのように返しますか?
質問
テンプレートクラスのベクトルのイテレータを返そうとしています(違いがあるかどうかはわかりませんが、読んだことがあるので、言及したいと思いました)。問題は、これをしようとすると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;の間に空白を追加するだけです。テンプレートを閉じるとき。
所属していません StackOverflow