- PR -

構造体参照について (C++/CLI)

投稿者投稿内容
おしろ
会議室デビュー日: 2007/10/27
投稿数: 14
投稿日時: 2007-10-31 12:02
VS2005のC++/CLIを使っています。

「Form1」から「Form2」に構造体データを渡したいのですが、
下記処理にすると、コンパイルエラーが出てしまいます。
構造体の参照がうまく出来ない様なのですが、ご教授お願いします。

「warning C4677: 'Form2': 公開されたメンバのシグネチャはアセンブリ プライベート型 'test::AAA' を含んでいます」


----------------------------------
 Form1.h
----------------------------------
#include "Form2.h"

namespace test {

  // 構造体
  ref struct AAA
  {
    int a;
    int b;
    int c;
  };

  public ref class Form1 : public System::Windows::Forms::Form
  {
  public:

    Form1(void)
    {
      AAA^ data = gcnew AAA();
      data->a = 1;
      data->b = 2;
      data->c = 3;

      Form2^ fm2 = gcnew Form2( data );
      fm2->ShowDialog();

  (省略)

----------------------------------
 Form2.h
----------------------------------
#include "Form1.h"

namespace test {

  public ref class Form2 : public System::Windows::Forms::Form
  {
  public:
    Form2( AAA^ data )←←← test::AAA にしてもダメ
    {
      label1->Text = data->a;
    }

  (省略)

----------------------------------
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-10-31 12:24
C++/CLI言語仕様の12.4を見てみてください。
トップレベル(入れ子になっていない)の型の可視性はデフォルトでprivateです。
つまり、AAAはprivateです。
これはアセンブリの外に型の情報が公開されないことを意味します。
Form1とForm2が属するアセンブリは別のものですか?


[ メッセージ編集済み 編集者: 一郎 編集日時 2007-10-31 12:24 ]
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-10-31 12:33
あれ、良く見るとコンパイルエラーじゃなくて、警告ですか。
アセンブリの外でForm2のコンストラクタを使わなければ大丈夫かもしれないですね。
ということは、Form1とForm2は同じアセンブリなんですよね。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-10-31 12:48
Form2( AAA^ data ) が public で、AAA が private だから矛盾になっているんですね。

# 警告止まりって事はコンパイルできるのか…。どうなるんだろう。
_________________
囚人のジレンマな日々
未記入
会議室デビュー日: 2007/08/28
投稿数: 18
投稿日時: 2007-10-31 12:54
警告ですが、これが元でエラーが出てしまいます。

アセンブリがよくわかっていないのですが、1つのexe
のみで、dllではないです。なので同じと思います。

publicで参照する方法はあるのでしょうか。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-10-31 13:08
C++/CLI言語仕様の12.4を見てみてください。
可視性を指定することができます。
具体的にはpublicというキーワードをAAAに付けてください。

ところであなたはスレッドを立てた方と同じ方?
@ITの利用規約に
メンバー登録は、利用者1人につき1件に限ります。
とありますので、利用規約違反じゃないでしょうか。
おしろ
会議室デビュー日: 2007/10/27
投稿数: 14
投稿日時: 2007-10-31 13:25
構造体をpublicにしましたが、
Form2で認識出来ませんでした。
public ref struct AAA

新しく登録したものを使っていたのですが、
間違えて昔登録したものを使ってしまいま
した。1人1件は知らなかったので、昔の
ものは、登録削除したいと思います。
おしろ
会議室デビュー日: 2007/10/27
投稿数: 14
投稿日時: 2007-10-31 17:54
構造体を public にしてもエラーになってしまったので、
構造体 BBB を作成して、キャストして渡すことで何とか
いけました。不細工ですが、これでいこうと思います。
ありがとうございました。

----------------------------------
 Form1.h
----------------------------------
#include "Form2.h"

namespace test {

  // 構造体
  public ref struct AAA
  {
    int a;
    int b;
    int c;
  };

  public ref class Form1 : public System::Windows::Forms::Form
  {
  public:

    Form1(void)
    {
      AAA^ data = gcnew AAA();
      data->a = 1;
      data->b = 2;
      data->c = 3;

      Form2^ fm2 = gcnew Form2( reinterpret_cast<BBB^>(data) );
      fm2->ShowDialog();

  (省略)

----------------------------------
 Form2.h
----------------------------------
#include "Form1.h"

namespace test {

  // 構造体
  public ref struct BBB
  {
    int a;
    int b;
    int c;
  };

  public ref class Form2 : public System::Windows::Forms::Form
  {
  public:
    Form2( BBB^ data )
    {
      label1->Text = data->a;
    }

  (省略)

スキルアップ/キャリアアップ(JOB@IT)