NET 2003 C++ のマネージとアンマネージに関する質問です。
「__gc class」から、「__nogc class」の中に作った、「__nogc struct」構造体を使用しようとすると、「error LNK2020: 未解決のトークン」といったエラーになってしまい、
ビルドができません。
構造体を持つクラスの指定を「__gc class」に指定すると、ビルドが通るようになります。
これはどういった理由なのでしょうか?
マネージクラスから、アンマネージクラスの構造体は利用できないのでしょうか?
利用できるように改善する方法がございましたら、お教えいただけますと幸いです。
何卒よろしくお願いします。
No.5ベストアンサー
- 回答日時:
>B.hに、、__nogc struct Cの構造体の変数 *をstaticで宣言していたのですが、
>このstaticを外したところ、コンパイルが通りました。
クラスCのメンバ変数に struct Cのポインタ変数をもっていたということでしょうか。staticなメンバはコンストラクタの引数リストでなくグローバルな部分で初期化しなくてはならないのでそれが抜けていたのですかね。staticにする理由があるのであれば(異なるclass Cのインスタンス間で共通の変数を使いたい場合)その部分を見てみるのもよいかと思います。
ご回答ありがとうございます。
>クラスCのメンバ変数に struct Cのポインタ変数をもっていた
ご指摘とおりの状況です。
しかし、構造体以外のもの(intなど)の変数でも、staticにすると同様のエラーとなり、また、初期化しようとしますと、「error C2864」が出てしまい、const静的整数データ以外はグローバルで初期化できないといったエラーになるようです。
__nogcのクラスは一般の.NETと扱いが変わるみたいですね。
ちょっと難しいですが、今後も調査し続けようと思います。
ありがとうございました!
No.4
- 回答日時:
全然役に立ちませんが 1点だけ:
その結果なら (2) は YES が正しいです. 状況は「コンパイルは通っているがリンクができていない」です.
「コンパイル」と「リンク」はわけて考えてください.
この回答への補足
申し訳ございません。理由がよく分からないのですが、解決しました。
B.hに、、__nogc struct Cの構造体の変数 *をstaticで宣言していたのですが、
このstaticを外したところ、コンパイルが通りました。
全く理由が分からないので、ちゃんとした解決にはなっていないのですが、とりあえずエラーは出なくなったという報告をさせていただきます。
皆様本当にありがとうございました。
ご回答ありがとうございます。
本当に重ね重ね申し訳ありません。VC++に慣れていないようで、簡単な違いにも気付きませんでした。
__gcと__nogcのリンクの違いについて調べれば答えが出てきそうですね。
そちらの方で、ヘルプをもう一度読み返してみます。
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)が正しいとするコンパイルは通っているので名前空間の問題ではないとは思います。
たびたびのご回答、まことに感謝いたします。
ご指摘の点を、お答させていただきます。
(1)yes
(2)no
LNK2020のビルドエラーとなるため、コンパイルは通っていません。(※他のエラーは出ていません)
(3)yes
名前空間は指定してあります。No.1様にお礼致しましたが、__nogcにアクセス指定子がつけられないのは、
何か関係あるのでしょうか?
また、疑問点ございましたら、なんなりとお願い申し上げます。
No.1
- 回答日時:
クラスが違えば名前空間も異なる筈です。
異なる名前空間にあるオブジェクトを参照する場合は、名前空間を明示しなければなりません。
オブジェクトの定義が「他のクラスからの参照を許している」状態で「正しい参照」さえすれば、どこにあるオブジェクトだろうが参照出来る筈です。
ご回答ありがとうございます。
__nogc classはアクセス指定子が指定できない(publicなどを書くとC3381エラーとなる)という仕様ですが、
そもそも__nogcのクラスは他所から使用できないのでしょうか?
__nogcクラス内の__nogc structの内部には、きちんとpublic指定してあります。
名前空間も指定して、呼び出し側で、呼び出し元のnamespaceをusingしています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
.jarファイルの中身って書き換...
-
javaが文字コードの影響でコン...
-
importしたパッケージが見つか...
-
javax.servlet は存在しません...
-
-deprecationとは?
-
IIS環境でJAVAを使用したい
-
ANT によるJSPコンパイル方法
-
MacOSX10.2でのjavaアプリの実...
-
コンパイル時のクラス生成について
-
Beagle Bone Blackについて
-
VB.net2010で開発しています。
-
Eclipseで、プロジェクト名のと...
-
html上で、バッチやexeファイル...
-
マイクラjavaでForgeを入れたい...
-
classファイルについて
-
eclipseでスタックサイズを変更...
-
eclipseで1ファイルの警告を100...
-
この <windows.h> はどこに在る...
-
Eclipse(JAVA)のデバッグで他...
-
JAVAにのeclipseに関する質問で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
.jarファイルの中身って書き換...
-
IIS環境でJAVAを使用したい
-
javaが文字コードの影響でコン...
-
javax.servlet は存在しません...
-
eclipseの構文エラーについて
-
TOMCAT_HOMEって?
-
Eclipse3.5EEでJavaのコンパイ...
-
逆コンパイルの見方について
-
「識別子がクラス名でも名前空...
-
コンパイルエラーに出てくる、i...
-
javaの簡単なソースがコンパイ...
-
Javaのコンパイル結果が表示さ...
-
Java 文字コードのエンコーディ...
-
-deprecationとは?
-
配列に対してsetText()は使えな...
-
JAVAでC/C++の条件コンパイルの...
-
warファイルを展開するとタイム...
-
日本語対応 逆コンパイラについて
-
exlipseでデバックエラーが発生...
-
Javaについて教えてね。
おすすめ情報