C++です。

class B;
class A
{
B m_; // error 認識できない型
};
templete<T> class C
{....};
class B : public C<int>
{
A m_;
}
派生させた関数を上記のように使用すると、上記のエラーが出て、コンパイルに失敗してしまいます。ご指摘お願いいたします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2004/07/31 08:29:05
  • 終了:--

回答(2件)

id:kokutenho No.1

kokutenho回答回数23ベストアンサー獲得回数02004/07/31 08:41:32

ポイント40pt

http://www.hatena.ne.jp/1091230145#

C++です。 class B; class A { B m_; // error 認識できない型 }; templete<T> class C {....}; class B : public C<int> { A m_; } 派生させた関数を上記のように使用する.. - 人力検索はてな

URLはダミーです。

無限ループになってしまいますので、コンパイルできませんね。

class B;

class A

{

B* m_;

};

templete<T> class C

{....};

class B : public C<int>

{

A* m_;

}

ポインタを持つようにしてはいかがですか?

id:disca

回答ありがとうございます。

具体的に実装してみました。

#include <iostream>

class B;

class A

{

public:

B *m_;

void func()

{

m_->m_= NULL;

};

A(){};

~A(){};

};

template<class T> class C

{

public:

C(){};

~C(){};

};

class B : public C<int>

{

public:

B(){};

~B(){};

A *m_;

};

int main(int argc, char* argv[])

{

A a;

a.m_= new B;

a.func();

delete a.m_;

return 0;

}

Test.cpp

test.cpp(12) : error C2027: 認識できない型 ’B’ が使われています。

test.cpp(3) : ’B’ の宣言を確認してください。

test.cpp(12) : error C2227: ’->m_’ : 左側がクラス、構造体、共用体へのポインタではありません。

どうしてもエラーが出てしまいます。

2004/07/31 12:54:33
id:syuzabu No.2

syuzabu回答回数155ベストアンサー獲得回数22004/07/31 12:17:53

ポイント40pt

こんにちわ、所謂クラスの相互参照って奴でしょうか?

難しいことされてますね、非常に勉強になります。

理論は良く分からない(^-^;)のですが、一応コンパイル出来たので報告致します。

クラスAもしくはクラスBのメンバ変数m_(のどちらか、もしくは両方を)をポインタとして宣言したらコンパイル出来ました。

多分discaさんの方法だとクラスAを宣言したとして

Bが作られ、そのBからAがまた作られ、そのAからBが・・・(以下略)

(イメージとしては new A().m_.m_.m_.m_ ... みたいな感じでしょうか?)

となり、コンパイラも正しく解釈出来ないのではないでしょうか?

ポインタとすることでこの流れを断ち切りコンパイルが通ったと思われます。

すみません、根拠がない勝手な考えなんで参考にしないで下さい。(^-^;)

あとイージーミスでしょうか?下記のままだとコンパイルエラーでます。

>> templete<T> class C

template<class T> class C

ではでは。

id:disca

回答ありがとうございます。掲載ページとても参考になります。

#include <iostream>

class B;

class A

{

public:

B *m_;

void func();

A(){};

~A(){};

};

template<class T> class C

{

public:

C(){};

~C(){};

};

class B : public C<int>

{

public:

B(){};

~B(){};

A *m_;

};

void A::func()

{

m_->m_= NULL;

};

int main(int argc, char* argv[])

{

A a;

a.m_= new B;

a.func();

delete a.m_;

return 0;

}

おかげさまでコンパイルが通りました。

ちなみに、Microsoft の ATL ライブラリでこういった状況に陥ってしまいました。

2004/07/31 13:05:21
  • id:disca
    ありがとうございました。

    回答してくださり、たいへんありがとうございました。
    少ないポイントで足しにはなりませんが、
    重ねて御礼もうしあげます。(^^/
  • id:syuzabu
    勉強になりました。

    プログラマとしてまだまだ未熟なのでこういった質問を見る度
    「お〜、こんなことするんだorできるんだ」と感心いたします。

    その度、どうやったら解決出来るのかなと自分なりに調べております。
    質問者ならず、回答者も知識が付くのが良い感じですねぇ・・・

    こちらこそ、勉強させて頂きました。ありががとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません