¿Cómo devuelve un iterador de vector desde una variable en una clase con plantilla?

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

  •  06-07-2019
  •  | 
  •  

Pregunta

Estoy tratando de devolver un iterador para un vector en una clase con plantilla (no estoy seguro de si eso hace la diferencia, pero he leído eso, así que pensé en mencionarlo). El problema es que recibo un error acerca de que C ++ no admite default-int cuando intento esto. He buscado en línea y, por lo que puedo ver en foros y explicaciones, no creo que esté tan lejos, simplemente no se 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();
}

Los errores que obtengo son:

error C2146: syntax error : missing ';' before identifier 'GetRowIterator'

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   

Editar:
Cambió los corchetes angulares finales para que no estén tan juntos, el mismo error.

¿Alguna idea de por qué ocurre esto?
Como siempre, gracias por consejos / ayuda por adelantado!

¿Fue útil?

Solución

Recuerde también usar typename al declarar el tipo de retorno dependiente de la plantilla:

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

y la definición del método

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

Observe también que al definir un método de clase de plantilla fuera de la definición de clase, debe usar la palabra clave de plantilla:

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

Para que el compilador pueda saber de qué se trata la T.

Otros consejos

Esta parte aquí:

vector<shared_ptr<vector<T>>>

Es un problema con la sintaxis de C ++ que no puede poner > > juntos así.

vector<shared_ptr<vector<T> > >

Este es un problema que está abordando el nuevo estándar.

Debido a que el lexer es la primera etapa del compilador, ve el > > > como operador de desplazamiento a la izquierda seguido de > ;. Por lo tanto, obtiene errores de sintaxis en su código. Para eliminar este problema, solo necesita agregar un espacio en blanco entre > al cerrar plantillas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top