幼稚園時代「何組」でしたか?

C++/CLIでクラスの中に定義された構造体等を、複数のクラス間で相互利用したいのですが、そのようなことは可能なのでしょうか。

とりあえず以下のコードを見ていただきたいのですが、

ref class class1;
ref class class2;

ref class class1
{
public:
 enum struct enum1
 {
  aa,bb
 };

 void func1a(class1^ obj){} // 1. OK
 void func2a(class2^ obj){} // 2. OK

 void func1b(class1::enum1 e){} // 3. OK
 void func2b(class2::enum2 e){} // 4. ERROR
};

ref class class2
{
public:
 enum struct enum2
 {
  aa,bb
 };

 void func1a(class1^ obj){} // 5. OK
 void func2a(class2^ obj){} // 6. OK

 void func1b(class1::enum1 e){} // 7. OK
 void func2b(class2::enum2 e){} // 8. OK
};

これの4.がコンパイルエラーになります。
このような構造を定義することはできないのでしょうか。

A 回答 (1件)

 こんばんは。


 どうやら、無理な様です。
 列挙体をクラスの外に出して一番上に書けば解決ですが、如何してもクラス内に置く事を死守するのであれば、「4」のメンバ関数をテンプレートにして、class2::enum2が見えている所でテンプレートの全特化を行えば出来ます。
 以下参考程度になれば。

// clrconsole.cpp : メイン プロジェクト ファイルです。
#include"stdafx.h"

using namespace System;

ref class class1;
ref class class2;

ref class class1
{
public:
enum struct enum1
{
aa,bb
};

void func1a(class1^ obj){} // 1. OK
void func2a(class2^ obj){} // 2. OK

void func1b(class1::enum1 e){} // 3. OK
template<class _Enum>
void func2b(_Enum e);// 4. 中身を引っこ抜く
};

ref class class2
{
public:
enum struct enum2
{
aa,bb
};

void func1a(class1^ obj){} // 5. OK
void func2a(class2^ obj){} // 6. OK

void func1b(class1::enum1 e){} // 7. OK
void func2b(class2::enum2 e){} // 8. OK
};

// 4. 中身
template<>
void class1::func2b<class2::enum2>(class2::enum2 e)
{
//class2::enum2の時のみ
}

int main(array<System::String ^> ^args)
{
class1^ c = gcnew class1();

c->func2b(class2::enum2::aa);
c->func2b(class2::enum2::bb);

//適合しないenumを入れるとリンクエラーになる
//c->func2b(class1::enum1::aa);
//c->func2b(class1::enum1::bb);

return 0;
}
    • good
    • 0
この回答へのお礼

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

やっぱり無理なんでしょうか...

テンプレートを使うというのは思いつかなかったですが、そこまでするのであれば、個人的な好みでいえば

void func2b(int e);
c->func2b((int)class1::enum1::aa);

のほうが良いかと思います。これだと普通のC++の型安全度と同じなので。

お礼日時:2009/08/22 11:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!