0

したがって、一緒に使用したいかなり単純なテンプレートのセットがありますが、コンパイラーは B::a が不完全な型であると私に言い続けます。すべてが前方宣言されていますが、それでも機能しません...

#include <iostream>

using namespace std;

template <typename T> class A;
template <typename T> class B;

template <typename T>
class A{
public:
    void ATestFunction();
    void CallBFunction();
protected:
    B<T> b;
};

template <typename T>
class B{
public:
    void BTestFunction();
    void CallAFunction();

protected:
    A<T> a;
};

template <typename T>
void A<T>::ATestFunction(){
    cout << "A was used for a function call" << endl;
}

template <typename T>
void B<T>::BTestFunction(){
    cout << "B was used for a function call" << endl;
}


template <typename T>
void A<T>::CallBFunction(){
    b.BTestFunction();
}

template <typename T>
void B<T>::CallAFunction(){
    a.ATestFunction();
}

int main()
{
    A<int> dragons;
    dragons.CallBFunction();
    return 0;
}

相互に依存するいくつかの配列型クラスのプログラミング ([][] のようにアクセスできる 2 次元配列の実装) で問題が発生したため、これを尋ねますが、この問題が発生し、作業にギアが投げ込まれました。 . このテスト プログラムを作成しましたが、それでも失敗します。Linux で MinGW 4.7.2 と GNU g++ の両方を試しましたが、それぞれ同じ問題が発生しました。

4

2 に答える 2

0

ポインターを使用したとしても、それは機能しませんでした。それは基本的に、作成されている A´s と B´s の無限ループをトリガーします。

A が作成 B が作成 A が作成 B が A を作成...

これはうまくいくでしょう。

#include <iostream>

using namespace std;

template<typename T> class A;
template<typename T> class B;

template<typename T>
class A
{
public:
    A()
    {
        b = new B<T>(this);
    }
    A(B<T>* pb)
    {
        b = pb;
    }
    void ATestFunction()
    {
        cout << "A was used for a function call" << endl;
    }
    void CallBFunction()
    {
        b->BTestFunction();
    }
protected:
    B<T>* b;
};

template<typename T>
class B
{
public:
    B()
    {
        a = new A<T>(this);
    }
    B(A<T>* pa)
    {
        a = pa;
    }
    void BTestFunction()
    {
        cout << "B was used for a function call" << endl;
    }
    void CallAFunction()
    {
        a->ATestFunction();
    }

protected:
    A<T>* a;
};

int main()
{
    A<int> dragons;
    dragons.CallBFunction();

    B<int> bdragons;
    bdragons.CallAFunction();
    return 0;
}

または、静的関数を使用するだけかもしれません

#include <iostream>

using namespace std;

template<typename T> class A;
template<typename T> class B;

template<typename T>
class A
{
public:
    static void ATestFunction()
    {
        cout << "A was used for a function call" << endl;
    }
    void CallBFunction();

};

template<typename T>
class B
{
public:
    static void BTestFunction()
    {
        cout << "B was used for a function call" << endl;
    }
    void CallAFunction();

};
template<typename T>
void A<T>::CallBFunction()
{
    B<int>::BTestFunction();
}


template<typename T>
void B<T>::CallAFunction()
{
    A<int>::ATestFunction();
}

int main()
{
    A<int> dragons;
    dragons.CallBFunction();

    B<int> bdragons;
    bdragons.CallAFunction();
    return 0;
}
于 2013-04-04T01:53:53.520 に答える