Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/11/2014, 14:06
Lifka
 
Fecha de Ingreso: octubre-2014
Mensajes: 13
Antigüedad: 9 años, 6 meses
Puntos: 0
C++ error al acceder a miembro privado desde clase anidada y friend

El problema es el siguiente, tengo una clase llamada diccionario, en la que uso templates y tengo anidada la clase iterator. La clase diccionario es un tipo de objeto (no el de la STL pero parecido) con un vector (STL) de pair (STL), que contiene en el first un tipo key que no debe ser modificado, y en second que se corresponde con key y cuyos tipos varían gracias a los templates.

Clase diccionario en el fichero diccionario.h:
Código:
class diccionario;
Que contiene la clase anidada:
Código:
class iterator;
La cual está establecida como friend:
Código:
friend class iterator;
Dentro de la parte privada de la clase diccionario:
Código:
vector<entrada> dic;
Entrada se corresponde con:
Código:
typedef pair<Key, Def> entrada;
Ahora en el archivo diccionario.hxx (el cual está incluido correctamente en el .h y todo lo necesario...), tengo el siguiente método (el cual tiene su correspondiente cabecera en la parte pública de la clase anidada):

Código:
template <typename Key, typename Def> 
diccionario<Key,Def>::iterator::iterator( );
Este método debería crear un iterador que apunta al primer dato del vector privado de la clase padre.
Este puntero se guarda de la siguiente forma en la parte privada de la clase iterator:
Código:
pair<const Key, Def> * it_v;
Lo que quiero hacer en el método es algo como esto:
Código:
vector<pair<Key, Def>> dic2;
pair<const Key, Def> * it_v2 = (pair<const Key,Def> *) &dic2[0];
dic2 correspondería con el dato privado de la clase diccionario (el vector con la clave y el dato).
pair<const Key, Def> * it_v2 es it_v, de la parte privada de la clase anidada.
(pair<const Key,Def> *) es un casting ya que lo hemos declarado como constante en el iterador, pero el tipo de dato no estaba definido así.
&dic2[0] es &dic[0] la referencia que queremos devolver del dato mencionado anteriormente.
(Todo lo anterior funciona bien)
De modo que lo que quiero hacer es:
Código:
it_v = (pair<const Key,Def> *) &dic[0];
Peeeeero....
Cita:
g++ -o ejecV2 -D DICC_V2 -std=c++0x ejemplo.cpp -Iinclude
In file included from ejemplo.cpp:4:0:
diccionarioV2.hxx: In instantiation of ‘diccionario<Key, Def>::iterator::iterator() [with Key = std::basic_string<char>; Def = int]’:
ejemplo.cpp:112:35: required from here
diccionario.h:198:18: error: invalid use of non-static data member ‘diccionario<std::basic_string<char>, int>::dic’
In file included from diccionario.h:213:0,
from ejemplo.cpp:4:
diccionarioV2.hxx:296:7: error: from this location
make: *** [dic2] Error 1
El caso es que desde ese método no puedo acceder a dic (el vector) de ningún modo, esto también devuelve el mismo error:
Código:
Def a = dic.at(0).second;


No consigo acceder a los datos privados desde la clase amiga anidada, ¿alguien me ayuda?

Espero haberme expresado bien xD Gracias y un saludo.