Возвратите указатель на вложенный внутренний класс от универсального внешнего класса

Я плохо знаком с C++, поэтому терпите меня. У меня есть универсальный класс по имени A. Вложенного класса по имени B. Содержание метода, названного getB (), который, как предполагается, возвращает новый экземпляр B. Однако я не могу заставить свой код компилировать. Вот то, что это смотрит like:#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();
}

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

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

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

Спасибо,

helixed

ОБНОВЛЕНИЕ:

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

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 {

};

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

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>*'

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

helixed

6
задан LandonSchropp 6 April 2010 в 21:50
поделиться

3 ответа

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

template <class E>
typename A<E>::B * A<E>::getB() {
    return new B();
}
7
ответ дан 10 December 2019 в 02:45
поделиться

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

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

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

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, то вам нужно использовать operator-> для вызова методов:

A<C>::B b = a->getB();
0
ответ дан 10 December 2019 в 02:45
поделиться

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

template <class E>
typename A<E>::B * A::getB() {
   return new B;
}
2
ответ дан 10 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: