Creé este vector, que tiene búferes:

std::vector<std::unique_ptr<locked_buffer<std::pair<int, std::vector<std::vector<unsigned char>>>>>> v1;

Luego, lleno este vector con búferes n y estos búferes tienen elementos aux. n es un número int que es un argumento. aux es otro argumento que también es de tipo int.

for(int i=0; i<n; i++){
   v1.push_back(std::unique_ptr<locked_buffer<std::pair<int,std::vector<std::vector<unsigned char>>>>> (new locked_buffer<std::pair<int, std::vector<std::vector<unsigned char>>>>(aux)));  
}

Pero cuando intento acceder a cada búfer del vector no puedo, porque no tengo claro cómo puedo acceder a un elemento específico de una estructura vectorial:

v1[0].put(image, false);

El error de compilación que tengo es el siguiente (la función put está definida en mi estructura locked_buffer personalizada):

error: ‘_gnu_cxx::_alloc_traits<std::allocator<std::unique_ptr<locked_buffer<std::pair<int, std::vector<std::vector<unsigned char> > > > > > >::value_type {aka class std::unique_ptr<locked_buffer<std::pair<int, std::vector<std::vector<unsigned char> > > > >}’ has no member named ‘put’
v1[i].put(image, false);

Gracias.

2
giorgioW 14 dic. 2016 a las 19:57
1
Creo que debes eliminar la referencia a unique_ptr, así que hazlo v1[i]->put...
 – 
yassin
14 dic. 2016 a las 20:03
¿Se supone que ese vector doble al final es una matriz 2d? Además, este sería un excelente lugar para usar using. Como template<class T> using myBufferType = std::pair<int, std::vector<std::vector<T>>>; y luego su tipo es std::unique_ptr<locked_buffer<myBufferType<unsigned char>>>
 – 
RyanP
14 dic. 2016 a las 20:32

1 respuesta

La mejor respuesta

v1[0] es un unique_ptr<locked_buffer<...>>. Para llamar a un método en el locked_buffer contenido, es necesario eliminar la referencia al unique_ptr, es decir

(*v1[0]).put(image, false);

O

v1[0]->put(image, false);
4
jsb 14 dic. 2016 a las 20:05