人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: disca
●カテゴリ:コンピュータ 生活
✍キーワード: Class C++ Class エラー コンパイル
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● kokutenho
●40ポイント

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_;

}

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

◎質問者からの返答

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

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

#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_’ : 左側がクラス、構造体、共用体へのポインタではありません。

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


2 ● syuzabu
●40ポイント

http://www.sist.ac.jp/~suganuma/learn/3-bu/10-sho/10-1/10-1.htm

C++自学・自習(第10章)

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

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

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

クラス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

ではでは。

◎質問者からの返答

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

#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 ライブラリでこういった状況に陥ってしまいました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ