class B;
class A
{
B m_; // error 認識できない型
};
templete<T> class C
{....};
class B : public C<int>
{
A m_;
}
派生させた関数を上記のように使用すると、上記のエラーが出て、コンパイルに失敗してしまいます。ご指摘お願いいたします。
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_;
}
ポインタを持つようにしてはいかがですか?
こんにちわ、所謂クラスの相互参照って奴でしょうか?
難しいことされてますね、非常に勉強になります。
理論は良く分からない(^-^;)のですが、一応コンパイル出来たので報告致します。
クラス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 ライブラリでこういった状況に陥ってしまいました。
回答ありがとうございます。
具体的に実装してみました。
#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_’ : 左側がクラス、構造体、共用体へのポインタではありません。
どうしてもエラーが出てしまいます。