Estoy tratando de descubrir SGI STL recientemente y escribo mi propio Vector, pero tengo problemas con un código de prueba simple. cuando intenté compilarlo, se queja así:

error: passing ‘const Vector<int>’ as ‘this’ argument of 
‘Vector<T,Alloc>::value_type* Vector<T, Alloc>::end() 
[with T = int; Alloc = __default_alloc_template<false, 0>; Vector<T, Alloc>::iterator = int*; Vector<T, Alloc>::value_type = int]’ 
discards qualifiers [-fpermissive]
size_type size() const { return size_type(end() - begin()); }

He buscado en el uso de la función const, dice que si el código no cambia ningún miembro en la clase, entonces puede ser una función const.

Realmente no lo entiendo, el tamaño () no cambia ningún miembro en el Vector, solo invoca otras dos funciones.

Revisé SGI_vector, y creo que es lo mismo para mi código.

¿Qué le pasa? ¡Gracias!

int main(){
    Vector<int> v2;
    cout<<"sizeof(v2): "<<v2.size()<<endl;
    return 0;
}

He escrito mi propio Vector como este:

template <class T, class Alloc = alloc>
class Vector {//primary template
public:
    typedef T value_type;
    typedef value_type* iterator;
    typedef size_t  size_type;

protected:
    typedef simple_alloc<value_type,alloc> data_allocator;
    iterator start;
    iterator finish;
    iterator end_of_storage;

public:
    iterator begin(){return start;}
    iterator end()  { return finish; }
    size_type size() const { return size_type(end() - begin()); }
    Vector():start(0),finish(0), end_of_storage(0){}
};
0
Jiahao Cai 10 dic. 2016 a las 09:46

1 respuesta

La mejor respuesta

size() es una función miembro de const. Desde esta función, solo puede llamar a otras funciones miembro de const. Las llamadas a begin() y end() en size() no están permitidas ya que begin() y end() no son funciones miembro de const.

Puede usar las variables miembro start y finish para implementar size().

size_type size() const { return size_type(finish - start); }
1
R Sahu 10 dic. 2016 a las 09:51
Consulte este sitio y busque la implementación de size (), creo el const-member function llama al non-const member functions
 – 
Jiahao Cai
10 dic. 2016 a las 09:55
Esa implementación de std::vector tiene const y no const sobrecargas de begin() y end(). La versión const devuelve un const_iterator mientras que la versión que no es const devuelve un iterator.
 – 
R Sahu
10 dic. 2016 a las 09:58