アプリ版:「スタンプのみでお礼する」機能のリリースについて

NET 2003 C++ のマネージとアンマネージに関する質問です。

「__gc class」から、「__nogc class」の中に作った、「__nogc struct」構造体を使用しようとすると、「error LNK2020: 未解決のトークン」といったエラーになってしまい、
ビルドができません。
構造体を持つクラスの指定を「__gc class」に指定すると、ビルドが通るようになります。
これはどういった理由なのでしょうか?
マネージクラスから、アンマネージクラスの構造体は利用できないのでしょうか?

利用できるように改善する方法がございましたら、お教えいただけますと幸いです。
何卒よろしくお願いします。

A 回答 (5件)

>B.hに、、__nogc struct Cの構造体の変数 *をstaticで宣言していたのですが、


>このstaticを外したところ、コンパイルが通りました。

クラスCのメンバ変数に struct Cのポインタ変数をもっていたということでしょうか。staticなメンバはコンストラクタの引数リストでなくグローバルな部分で初期化しなくてはならないのでそれが抜けていたのですかね。staticにする理由があるのであれば(異なるclass Cのインスタンス間で共通の変数を使いたい場合)その部分を見てみるのもよいかと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/10 11:58

全然役に立ちませんが 1点だけ:


その結果なら (2) は YES が正しいです. 状況は「コンパイルは通っているがリンクができていない」です.
「コンパイル」と「リンク」はわけて考えてください.

この回答への補足

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

皆様本当にありがとうございました。

補足日時:2009/07/07 10:06
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/07 09:08

もう一度確認ですが(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)が正しいとするコンパイルは通っているので名前空間の問題ではないとは思います。
    • good
    • 0
この回答へのお礼

たびたびのご回答、まことに感謝いたします。
ご指摘の点を、お答させていただきます。

(1)yes
(2)no
LNK2020のビルドエラーとなるため、コンパイルは通っていません。(※他のエラーは出ていません)
(3)yes


名前空間は指定してあります。No.1様にお礼致しましたが、__nogcにアクセス指定子がつけられないのは、
何か関係あるのでしょうか?

また、疑問点ございましたら、なんなりとお願い申し上げます。

お礼日時:2009/07/06 17:31

もう少し詳しい情報をください。



・__gc class A と__nogc class B と__nogc struct C
は別dllでしょうか。それとも同一dllでしょうか。
    • good
    • 0
この回答へのお礼

説明不足で大変申し訳ございません。

__gc class A
がA.cppで、

__nogc class Bの内部に、__nogc struct Cが存在し、
こちらがB.cpp

といった構成になっています。

お礼日時:2009/07/06 16:01

クラスが違えば名前空間も異なる筈です。



異なる名前空間にあるオブジェクトを参照する場合は、名前空間を明示しなければなりません。

オブジェクトの定義が「他のクラスからの参照を許している」状態で「正しい参照」さえすれば、どこにあるオブジェクトだろうが参照出来る筈です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
__nogc classはアクセス指定子が指定できない(publicなどを書くとC3381エラーとなる)という仕様ですが、
そもそも__nogcのクラスは他所から使用できないのでしょうか?

__nogcクラス内の__nogc structの内部には、きちんとpublic指定してあります。
名前空間も指定して、呼び出し側で、呼び出し元のnamespaceをusingしています。

お礼日時:2009/07/06 17:26

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