Rientro puntatore alla classe interna annidata dalla classe esterna generica
-
24-09-2019 - |
Domanda
Sono nuovo di C ++, in modo da portare con me. Ho una classe generica denominata A. A ha una classe annidata chiamato B. A contiene un metodo chiamato getB (), che dovrebbe restituire una nuova istanza di B. Tuttavia, non posso avere il mio codice per compilare. Ecco come si presenta: #include
A.h
template <class E>
class A {
public:
class B {
public:
int data;
};
B * getB();
};
A.cpp
#include "A.h"
template <class E>
A<E>::B * A::getB() {
return new B();
}
Quando provo a compilare questo, ottengo il seguente errore:
error: expected constructor, destructor, or type conversion before '*' token
Qualcuno sa che cosa sto facendo male?
Grazie,
helixed
UPDATE:
Grazie per le risposte veloci tutti. Ho ancora un po 'di problemi a trovare questo lavoro. Dopo aver preso i suggerimenti elencati qui, ho qualcosa di simile a questo:
A.h
template <class E>
class A {
public:
class B {
public:
int data;
};
B * getB();
};
template <class E>
typename A<E>::B * A<E>::getB() {
return new B();
}
class C {
};
Tuttavia, quando provo ad usare questo dal principale, ottengo un errore. Ecco il mio principale metodo:
main.cpp
#include "A.h"
int main(int argc, char *argv[])
{
A<C> *a = new A<C>();
A<C>::B *b = a.getB();
}
Quando provo a compilare questo, ottengo il seguente errore:
error: request for member 'getB' in 'a', which is of non-class type 'A<C>*'
Grazie ancora per le risposte rapide.
helixed
Soluzione
Il compilatore non è abbastanza intelligente per capire che "B" è un tipo quando "A" è templato. Provate ad usare typename.
template <class E>
typename A<E>::B * A<E>::getB() {
return new B();
}
Altri suggerimenti
È necessario utilizzare typename
nella definizione di suggerimento per il compilatore che B è un tipo.
template <class E>
typename A<E>::B * A::getB() {
return new B;
}
Risposta per l'aggiornamento:
Non c'è bisogno di new
tutto in C ++, in realtà, sarebbe meglio se non l'avete fatto, da allora si dovrà delete
esplicitamente la memoria allocata o utilizzare puntatori intelligenti.
Così, qui è il tuo codice rivisto:
template <class E>
class A {
public:
class B {
public:
int data;
};
B getB(); // Object, not pointer
};
template <class E>
typename A<E>::B A<E>::getB() {
return B();
}
#include "A.h"
int main(int argc, char *argv[])
{
A<C> a = A<C>();
A<C>::B b = a.getB();
}
Se si desidera new
classe A<C>
, allora avete bisogno di utilizzare il operator->
per richiamare i metodi:
A<C>::B b = a->getB();