Como você retornar um iterador vetor de uma variável em uma classe de modelo?
Pergunta
Eu estou tentando retornar um iterador para um vetor em uma classe de modelo (não tenho certeza se isso faz a diferença, mas eu li que pode, então eu pensei que eu iria falar dele). O problema é que eu tenho um erro sobre C ++ não apoiar default-int quando eu tentar isso. Eu olhei em linha e do que eu posso ver em fóruns e explanaions, eu não acho que eu sou que longe, ele só não vai compilar.
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();
}
Os erros que eu recebo são:
error C2146: syntax error : missing ';' before identifier 'GetRowIterator'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Editar:
Mudou o ângulo entre parênteses final para que eles não são tão próximas umas das outras -. Mesmo erro
Quaisquer pensamentos sobre por que isso está ocorrendo?
Como sempre, obrigado por conselho / ajuda antecipadamente!
Solução
Lembre-se também de usar typename quando declarar o tipo de retorno dependente de molde:
typename vector< shared_ptr< vector< T > > >::iterator GetRowIterator();
e a definição do método
typename vector< shared_ptr< vector< T > > >::const_iterator Table<T>::GetRowIterator()
{
return data.begin();
}
Note também que ao definir um método de classe de modelo fora da definição de classe, você tem que usar a palavra-chave template:
template <class T> typename vector< shared_ptr< vector< T > > >::const_iterator Table<T>::GetRowIterator()
{
return data.begin();
}
Assim que o compilador pode saber o que o T está em causa.
Outras dicas
Esta parte aqui:
vector<shared_ptr<vector<T>>>
É um problema com o C ++ sintaxe que você não pode colocar >> juntos assim.
vector<shared_ptr<vector<T> > >
Este é um problema que está sendo abordado pelo novo padrão.
Porque o lexer é a primeira etapa do compilador vê o >>> como um desvio à esquerda do operador seguido por>. Assim que você está recebendo erros de sintaxe em seu código. Para suprimir este problema você só precisa adicionar espaço em branco entre o> ao fechar modelos.