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

È stato utile?

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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top