Como você retornar um iterador vetor de uma variável em uma classe de modelo?

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

  •  06-07-2019
  •  | 
  •  

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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top