一般的な外部クラスから入れ子の内部クラスへのポインタを返します

StackOverflow https://stackoverflow.com/questions/2587558

  •  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();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top