Возврат указателя на вложенный внутренний класс из общего внешнего класса - PullRequest
6 голосов
/ 06 апреля 2010

Я новичок в C ++, так что терпите меня.У меня есть универсальный класс с именем A. A имеет вложенный класс с именем B. A содержит метод с именем getB (), который должен возвращать новый экземпляр B. Однако я не могу получить свой код для компиляции.Вот как это выглядит: #include

Ah

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();
}

Когда я пытаюсь скомпилировать это, я получаю следующую ошибку:

error: expected constructor, destructor, or type conversion before '*' token

Кто-нибудь знает, что я делаю неправильно?

Спасибо,

Спираль

ОБНОВЛЕНИЕ:

Спасибо забыстрые ответы всем.У меня все еще есть небольшие проблемы с получением этой работы.После принятия предложений, перечисленных здесь, у меня есть что-то вроде этого:

Ах

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 {

};

Однако, когда я пытаюсь использовать это из основного, я получаю ошибку.Вот мой основной метод:

main.cpp

#include "A.h"

int main(int argc, char *argv[])
{
    A<C> *a = new A<C>();
    A<C>::B *b = a.getB();
}

Когда я пытаюсь скомпилировать это, я получаю следующую ошибку:

error: request for member 'getB' in 'a', which is of non-class type 'A<C>*'

Еще раз спасибо за быстрыйответы.

спирали

Ответы [ 3 ]

7 голосов
/ 06 апреля 2010

Компилятор не достаточно умен, чтобы понять, что «B» - это тип, когда «A» является шаблоном.Попробуйте использовать typename.

template <class E>
typename A<E>::B * A<E>::getB() {
    return new B();
}
2 голосов
/ 06 апреля 2010

Вы должны использовать typename в своем определении, чтобы намекнуть компилятору, что тип B является типом.

template <class E>
typename A<E>::B * A::getB() {
   return new B;
}
0 голосов
/ 07 апреля 2010

Ответ на обновление:

Вам не нужно new все в C ++, на самом деле, было бы лучше, если бы вы этого не делали, поскольку тогда вам придется явно delete выделить память или использовать умные указатели.

Итак, ваш код исправлен:

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();
}

Если вы хотите new класс A<C>, то вам нужно использовать operator-> для вызова методов:

A<C>::B b = a->getB();
...