• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:__gcクラスから、__nogcクラスの構造体を使おうとするとLNK2020エラーが出ます)

__gcクラスから、__nogcクラスの構造体を使おうとするとLNK2020エラーが出ます

このQ&Aのポイント
  • NET 2003 C++ のマネージとアンマネージに関する質問です。
  • 「__gc class」から、「__nogc class」の中に作った、「__nogc struct」構造体を使用しようとすると、「error LNK2020: 未解決のトークン」といったエラーになってしまい、ビルドができません。
  • マネージクラスから、アンマネージクラスの構造体は利用できないのでしょうか? 利用できるように改善する方法がございましたら、お教えいただけますと幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • koyadi
  • ベストアンサー率36% (7/19)
回答No.5

>B.hに、、__nogc struct Cの構造体の変数 *をstaticで宣言していたのですが、 >このstaticを外したところ、コンパイルが通りました。 クラスCのメンバ変数に struct Cのポインタ変数をもっていたということでしょうか。staticなメンバはコンストラクタの引数リストでなくグローバルな部分で初期化しなくてはならないのでそれが抜けていたのですかね。staticにする理由があるのであれば(異なるclass Cのインスタンス間で共通の変数を使いたい場合)その部分を見てみるのもよいかと思います。

noname#102908
質問者

お礼

ご回答ありがとうございます。 >クラスCのメンバ変数に struct Cのポインタ変数をもっていた ご指摘とおりの状況です。 しかし、構造体以外のもの(intなど)の変数でも、staticにすると同様のエラーとなり、また、初期化しようとしますと、「error C2864」が出てしまい、const静的整数データ以外はグローバルで初期化できないといったエラーになるようです。 __nogcのクラスは一般の.NETと扱いが変わるみたいですね。 ちょっと難しいですが、今後も調査し続けようと思います。 ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

全然役に立ちませんが 1点だけ: その結果なら (2) は YES が正しいです. 状況は「コンパイルは通っているがリンクができていない」です. 「コンパイル」と「リンク」はわけて考えてください.

noname#102908
質問者

お礼

ご回答ありがとうございます。 本当に重ね重ね申し訳ありません。VC++に慣れていないようで、簡単な違いにも気付きませんでした。 __gcと__nogcのリンクの違いについて調べれば答えが出てきそうですね。 そちらの方で、ヘルプをもう一度読み返してみます。

noname#102908
質問者

補足

申し訳ございません。理由がよく分からないのですが、解決しました。 B.hに、、__nogc struct Cの構造体の変数 *をstaticで宣言していたのですが、 このstaticを外したところ、コンパイルが通りました。 全く理由が分からないので、ちゃんとした解決にはなっていないのですが、とりあえずエラーは出なくなったという報告をさせていただきます。 皆様本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • koyadi
  • ベストアンサー率36% (7/19)
回答No.3

もう一度確認ですが(1)、(2)、(3)についてyes/Noで教えてください。NOの場合は補足をお願いします。 (1)__gc class A と__nogc class B と__nogc struct C は同一プロジェクトでファイルが別。(classBとstruct Cは同一ファイルで定義) (2)この状態だとコンパイルは通るがリンクでエラーになる(LNK2020) (3)__gc class Bと定義を変えるとするとコンパイルもリンクも通る。 でよいですか? (2)が正しいとするコンパイルは通っているので名前空間の問題ではないとは思います。

noname#102908
質問者

お礼

たびたびのご回答、まことに感謝いたします。 ご指摘の点を、お答させていただきます。 (1)yes (2)no LNK2020のビルドエラーとなるため、コンパイルは通っていません。(※他のエラーは出ていません) (3)yes 名前空間は指定してあります。No.1様にお礼致しましたが、__nogcにアクセス指定子がつけられないのは、 何か関係あるのでしょうか? また、疑問点ございましたら、なんなりとお願い申し上げます。

全文を見る
すると、全ての回答が全文表示されます。
  • koyadi
  • ベストアンサー率36% (7/19)
回答No.2

もう少し詳しい情報をください。 ・__gc class A と__nogc class B と__nogc struct C は別dllでしょうか。それとも同一dllでしょうか。

noname#102908
質問者

お礼

説明不足で大変申し訳ございません。 __gc class A がA.cppで、 __nogc class Bの内部に、__nogc struct Cが存在し、 こちらがB.cpp といった構成になっています。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8536/19407)
回答No.1

クラスが違えば名前空間も異なる筈です。 異なる名前空間にあるオブジェクトを参照する場合は、名前空間を明示しなければなりません。 オブジェクトの定義が「他のクラスからの参照を許している」状態で「正しい参照」さえすれば、どこにあるオブジェクトだろうが参照出来る筈です。

noname#102908
質問者

お礼

ご回答ありがとうございます。 __nogc classはアクセス指定子が指定できない(publicなどを書くとC3381エラーとなる)という仕様ですが、 そもそも__nogcのクラスは他所から使用できないのでしょうか? __nogcクラス内の__nogc structの内部には、きちんとpublic指定してあります。 名前空間も指定して、呼び出し側で、呼び出し元のnamespaceをusingしています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • .NET Frameworkのクラスのみで書いたプログラムをマネージアプリケーションと呼ぶのでしょうか?

    Visual C++ の .NET 2003で開発しております。 マネージとアンマネージについて質問です。 マネージアプリケーションとは、「.NET Framework」のクラスライブラリ郡群のみで構成されたプログラム、という解釈で合ってますでしょうか? (Visual C++ .NETプログラミングテクニック 田中正造著より) 「Windows フォーム アプリケーション(.NET)」で作成したプロジェクトで、「System.String」のクラスを使用したところ、「System.String」はアンマネージです…といったエラーが頻発してしまい、この解釈が間違っているのかと思い、質問させて頂きたく思います。 「__gc」キーワード付きでclass宣言したところ、エラーは出なくなりました。 アンマネージと__gcの関係などもあるのでしょうか? ヘルプを探ってみても見付かりませんでした…。 もし、詳しい方いらっしゃいましたら、お知恵をお貸しください。 よろしくお願いします。

  • C,C++,C++/CLIの構造体とクラス

    C++の構造体・クラスって、メンバのアクセス指定子のデフォルトが privateかpublicかという違い「だけ」しか全くないのでしょうか? クラスにおける value class / ref class という分類はC++/CLIのもので これについては value class の方は C言語の構造体に近いという事でいいでしょうか? ref classの方は ネイティブのC++のクラスを マネージ用にしたようなもので C++/CLIの構造体は C++のそれと同じで OKですか? そしてそれらの構造体には、値型・参照型といった分類はないのでしょうか?

  • VC++の構造体について。

    テキストファイルからのテキスト文を1行づつString^ dataに入れておいてストックしておくようなグローバル変数を作るために次のような構造体を作成しましたがエラーが出てしまいます。 このような構造体を作成して eeprom_data eeprom_data;と宣言して eeprom_data->line_test[0].data; などのようにデータにアクセスするようにしたいのですが、どのようにしたらできますでしょうか? typedef struct _line_test_ { String^ data; String^ adress; int length; }line_test; typedef struct _eeprom_data_ { array<line_test^>^ line_test = gcnew array<line_test^>(32); }eeprom_data; 現在のエラー内容はこのように表示されています。 1> HomeBank.cpp 1>c:\.....\10-03\homebank\homebank\Form1.h(763): error C2814: 'HomeBank::Form1::_line_test_' : ネイティブ型をマネージ型 'HomeBank::Form1' 中に入れ子にすることはできません 1> c:\.....\10-03\homebank\homebank\Form1.h(24) : 'HomeBank::Form1' の宣言を確認してください。 1>c:\.....\10-03\homebank\homebank\Form1.h(764): error C3265: マネージ 'data' をアンマネージ 'HomeBank::Form1::_line_test_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(765): error C3265: マネージ 'adress' をアンマネージ 'HomeBank::Form1::_line_test_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(772): error C2814: 'HomeBank::Form1::_eeprom_data_' : ネイティブ型をマネージ型 'HomeBank::Form1' 中に入れ子にすることはできません 1> c:\.....\10-03\homebank\homebank\Form1.h(24) : 'HomeBank::Form1' の宣言を確認してください。 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3699: '^' : この間接指定を型 'HomeBank::Form1::line_test' で使用できません 1> コンパイラは、解析を続行するために '^' を '*' で置き換えます 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3699: '^' : この間接指定を型 'HomeBank::Form1::line_test' で使用できません 1> コンパイラは、解析を続行するために '^' を '*' で置き換えます 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3265: マネージ 'line_test' をアンマネージ 'HomeBank::Form1::_eeprom_data_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C2864: 'HomeBank::Form1::_eeprom_data_::line_test' : static const int データ メンバー以外をクラス内で初期化することはできません ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== どうぞご教授頂きますよう、よろしくお願いします。

  • クラス内の構造体の実体化とアクセス方法が・・

    クラス内の構造体の実体化とアクセス方法が解らなくて困っていまし。 ヘッダーで class data { public: struct SET_A { int time; char name[24]; }; }; と宣言したクラス内の構造体を使いたくて data::SET_A dataseta; dataseta.time = 1; などとしても構文エラーになってしまいます。 クラス内の構造体はどう実体化してアクセスしたりすれば良いのでしょうか?

  • vc2005.net 構造体の宣言について

    visual studio(VC++) .net 2005マネージを練習しています。 クラス内に構造体を作りたいのですがうまくいきません。 public ref class Form1:~~ 上記クラス中で public: static STRUCTTEST test = gcnew STRUCTTEST; 上記のように記述したところ '^'この間接指定を型STRUCTTESTで使用出来ません。 と出ます。 マネージだから'^'で良いのではないでしょうか。 ^をとったところ testをマネージtestslusion::Form1のメンバとして定義できません。混合型はサポートされません。 と出ます。マネージでは^が必要なはずなのでこれは分かるのですが・・・。 gcnewをnewにしても^を*にしてもコンパイルエラーが出ます。 これは何故でしょうか。 ちなみに配列を static array<int>^ test = gcnew array<int>(10); このように記述する事は分かりました。

  • 構造 他のクラスの構造体を別のクラスで使いたい。

    C#で以下のようにCls1で定義している構造体をCls2の引数に使いたいのですが 定義されていないエラーになります。 Cls2で再定義すると、同じものが2つできて修正するときに困りそうです。 プログラムの構造について、何か良い方法がありましたら教えてください。 namespace A { class Cls1 { public struct Kumi { public string name; public int age; } private test(){ Kumi k; k.name = "太郎"; k.age = 5; Cls2 c2 = new Cls2(); c2.Write(k); } } } 別のクラスファイル namespace A { class Cls2 { public Write(Kumi k){ } } }

  • 派生クラスで,基本クラスのメンバ変数である構造体の型を・・・

    派生クラスで,基本クラスのメンバ変数である構造体の型を戻り値の型とするメンバ関数を作りたいのですがエラーが発生してしまいます. class A{ protected: struct NODE{ char *name; NODE *next; } NODE *node; }; class B : public A{ public: NODE* sort(NODE* fnode); }; NODE* B::sort(NODE* fnode){ ←エラー ~~~~~ return ○○; } 現在このような状態です. よろしくお願いします.

  • C#で構造体の配列を持った構造体を使いたいのですが

    C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます

  • エラー lnk2019について

    現在C++でゲームの開発を行っています。 VC++でビルドしたところ以下のようなエラーが出ました。 error LNK2019: 未解決の外部シンボル _Direct3DRMCreate@4 が関数 "int __cdecl CreateObjects(struct HWND__ *)" (?CreateObjects@@YAHPAUHWND__@@@Z) で参照されました。 自分なりに調べたところリンクが出来ていないようなのですが、リンクするファイルはd3drm.libでよろしいのでしょうか? もしリンクするファイルがd3drm.libの場合、d3drm.libはどこでダウンロードすることができますか? ご教授よろしくお願いします。

  • ビルドエラー LNK1201

    開発環境は、VS.net 2003 です。 あるプロジェクトについて、デバッグを終了して、再度ビルドすると 「LINK : fatal error LNK1201: プログラム データベース 'c:\myprog\Debug\xxx.pdb' に書き込めません。ディスク容量不足、パスが無効、また十分な特権がない可能性があります。」 と表示され、ビルドが完了しません。 ソリューションを開いたままでは、改善されず。 他のソリューションを開いても、改善されず。 VSを終了すると、改善されます。 なので、デバッグ後は、一度VSを終了させてから、ビルドし直しています。