- ベストアンサー
__gcクラスから、__nogcクラスの構造体を使おうとするとLNK2020エラーが出ます
- NET 2003 C++ のマネージとアンマネージに関する質問です。
- 「__gc class」から、「__nogc class」の中に作った、「__nogc struct」構造体を使用しようとすると、「error LNK2020: 未解決のトークン」といったエラーになってしまい、ビルドができません。
- マネージクラスから、アンマネージクラスの構造体は利用できないのでしょうか? 利用できるように改善する方法がございましたら、お教えいただけますと幸いです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>B.hに、、__nogc struct Cの構造体の変数 *をstaticで宣言していたのですが、 >このstaticを外したところ、コンパイルが通りました。 クラスCのメンバ変数に struct Cのポインタ変数をもっていたということでしょうか。staticなメンバはコンストラクタの引数リストでなくグローバルな部分で初期化しなくてはならないのでそれが抜けていたのですかね。staticにする理由があるのであれば(異なるclass Cのインスタンス間で共通の変数を使いたい場合)その部分を見てみるのもよいかと思います。
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
全然役に立ちませんが 1点だけ: その結果なら (2) は YES が正しいです. 状況は「コンパイルは通っているがリンクができていない」です. 「コンパイル」と「リンク」はわけて考えてください.
お礼
ご回答ありがとうございます。 本当に重ね重ね申し訳ありません。VC++に慣れていないようで、簡単な違いにも気付きませんでした。 __gcと__nogcのリンクの違いについて調べれば答えが出てきそうですね。 そちらの方で、ヘルプをもう一度読み返してみます。
補足
申し訳ございません。理由がよく分からないのですが、解決しました。 B.hに、、__nogc struct Cの構造体の変数 *をstaticで宣言していたのですが、 このstaticを外したところ、コンパイルが通りました。 全く理由が分からないので、ちゃんとした解決にはなっていないのですが、とりあえずエラーは出なくなったという報告をさせていただきます。 皆様本当にありがとうございました。
- koyadi
- ベストアンサー率36% (7/19)
もう一度確認ですが(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)が正しいとするコンパイルは通っているので名前空間の問題ではないとは思います。
お礼
たびたびのご回答、まことに感謝いたします。 ご指摘の点を、お答させていただきます。 (1)yes (2)no LNK2020のビルドエラーとなるため、コンパイルは通っていません。(※他のエラーは出ていません) (3)yes 名前空間は指定してあります。No.1様にお礼致しましたが、__nogcにアクセス指定子がつけられないのは、 何か関係あるのでしょうか? また、疑問点ございましたら、なんなりとお願い申し上げます。
- koyadi
- ベストアンサー率36% (7/19)
もう少し詳しい情報をください。 ・__gc class A と__nogc class B と__nogc struct C は別dllでしょうか。それとも同一dllでしょうか。
お礼
説明不足で大変申し訳ございません。 __gc class A がA.cppで、 __nogc class Bの内部に、__nogc struct Cが存在し、 こちらがB.cpp といった構成になっています。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
クラスが違えば名前空間も異なる筈です。 異なる名前空間にあるオブジェクトを参照する場合は、名前空間を明示しなければなりません。 オブジェクトの定義が「他のクラスからの参照を許している」状態で「正しい参照」さえすれば、どこにあるオブジェクトだろうが参照出来る筈です。
お礼
ご回答ありがとうございます。 __nogc classはアクセス指定子が指定できない(publicなどを書くとC3381エラーとなる)という仕様ですが、 そもそも__nogcのクラスは他所から使用できないのでしょうか? __nogcクラス内の__nogc structの内部には、きちんとpublic指定してあります。 名前空間も指定して、呼び出し側で、呼び出し元のnamespaceをusingしています。
お礼
ご回答ありがとうございます。 >クラスCのメンバ変数に struct Cのポインタ変数をもっていた ご指摘とおりの状況です。 しかし、構造体以外のもの(intなど)の変数でも、staticにすると同様のエラーとなり、また、初期化しようとしますと、「error C2864」が出てしまい、const静的整数データ以外はグローバルで初期化できないといったエラーになるようです。 __nogcのクラスは一般の.NETと扱いが変わるみたいですね。 ちょっと難しいですが、今後も調査し続けようと思います。 ありがとうございました!