Я плохо знаком с 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
Компилятор недостаточно умен, чтобы понять, что "B" является типом, когда "A" является шаблоном. Попробуйте использовать typename.
template <class E>
typename A<E>::B * A<E>::getB() {
return new B();
}
Ответ на обновление:
Вам не нужно 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();
Вам нужно использовать typename
в вашем определении, чтобы намекнуть компилятору, что B является типом.
template <class E>
typename A<E>::B * A::getB() {
return new B;
}