[C++] Problema al compilar clases anidadas

dagavi

Buenas, tengo problemas para compilar un código que tenía hace tiempo y que diría que antes me funcionaba, no se si lo habré tocado o algo, pero la cosa es que ya no compila xD

El código es simplemente para definir un árbol, dentro de la clase árbol dispongo también de una clase Nodo, anidada de la siguiente forma:

spoiler

Como veis el árbol es un template. Nodo por estar anidado también puede hacer uso del mismo template.
Debajo de toda esta declaración de árbol están las definiciones de los métodos. Sin embargo el que da problemas es la cabecera de la definición del método "copiar" de Nodo.

Si pongo el código inline no pasa nada (los otros 2 métodos, eliminar e iguales, compilan bien). Sin embargo no soy capaz de "sacarlo" de la definición inline ya que me dice

Arbol.hpp:90: error: expected constructor, destructor, or type conversion before
 '*' token
Arbol.hpp:90: error: expected `;' before '*' token

Concretamente la cabecera que uso para la definición, en los casos que si funciona, es esta:

void Arbol<T>::Nodo::eliminar(Nodo* n){ // Igual en "iguales"

Sin embargo la que da el problema es copiar (línea 90 del archivo)

Nodo* Arbol<T>::Nodo::copiar(Nodo* ori) {

He pensado que el error podría estar en que Nodo* no está definido, ya que está dentro del espacio de nombres de arbol, por lo que también he probado:

Arbol<T>::Nodo* Arbol<T>::Nodo::copiar(Nodo* ori) {

con el mismo resultado, sin embargo, si lo elimino del todo (solo dejo el nombre de la función, sin lo que retorna), y al cambiar el error del compilador, me dice que las candidatas son:

candidate is: static Arbol<T>::Nodo* Arbol<T>::Nodo::copiar

Que es justo la segunda que pruebo. ¿Alguien sabe a que puede ser debido este error idiota de compilación? ¿Es que esa función en concreto solo se puede crear inline?

Khanser

por lo que yo veo, te falta cerrar el claudator de
Nodo() {
....
Nodo* b); } <-- este no está
}* praiz;

dagavi

Si te referías porque en el código abría el claudator de la constructora y no lo cerraba, entonces te he liado sin querer, al poner "constructora definida inline" no he cerrado el claudator, pero pensaba que ya se daba por supuesto que era una constructora (porque el nombre del método es el mismo que el del struct/clase) y lo de debajo otros métodos de Nodo.

Khanser

Joer macho, lo habias hasta indentado xDD No indentes si no esta anidado neng

Buffoncete

typedef struct Nodo.


Edito para explicarlo mejor:

Si haces un struct Nodo, luego para utilizarlo como parámetros tienes que poner struct delante, si haces un typedef struct Nodo, con poner Nodo vale

dagavi

#4 No está indentado, es culpa del [ code], si te das cuenta deja exactamente un espacio, el motivo es que empieza la numeración de "10, 11, 12..." que ocupa un carácter más y se lleva todo el código un espacio a la derecha xD (yo también me quedé al revisarlo :O si lo he indentado, y al darle a editar no había indentación)

#5 Tienes razón, pero me ha parecido curioso que se arreglara ya que en C++ nunca me ha echo falta escribir "struct Tal" para referenciar a un tipo. Eso solo me hacía falta en C donde si tenía que escribir "struct Tal" o usar el typedef. Pero bueno, ya lo tendré en cuenta para futuras clases anidadas xD

Gracias!

PD: Probando a ver en que casos me haría falta poner struct veo que solo me lo pide si la clase está anidada.

No me hace falta
Si me hace falta
Buffoncete

es que son muchos años con C++ ya tio xD

Usuarios habituales

  • Buffoncete
  • dagavi
  • Khanser