一般的な外部クラスから入れ子の内部クラスへのポインタを返します
-
24-09-2019 - |
質問
私はC ++に新たなんだ、そう私と一緒にクマ。私は私のコードをコンパイルするために取得することができない、A. Aと呼ばれるジェネリッククラスはB. Aと呼ばれる、ネストされたクラスは、しかしBの新しいインスタンスを返すことになっているgetB()というメソッドを、含まれていています。書式#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
UPDATE:
迅速な回答のみんなに感謝します。私はまだ少し問題この作業を取得することです。
:ここに記載されている提案を取った後、私はこのような何かを持っています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」がテンプレートされるタイプであることを図にスマート十分ではありません。型名を使用してみます。
template <class E>
typename A<E>::B * A<E>::getB() {
return new B();
}
他のヒント
あなたはBタイプであることをコンパイラにヒントをあなたの定義でtypename
を使用する必要があります。
template <class E>
typename A<E>::B * A::getB() {
return new B;
}
更新に答えます:
あなたはしなかった場合、あなたは明示的に割り当てられたメモリを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();
所属していません StackOverflow