1 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:53:59 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part61 pc11.2ch.net/test/read.cgi/tech/1205059063/
2 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:54:50 ] ■基本■ [C++ FAQ] www.parashift.com/c++-faq-lite/ www.bohyoh.com/CandCPP/FAQ/ (日本語) Cとその仕様を比較しながらの解説なので分かりやすい。 ***** 質問の前に必ずこの二つに目を通してください ***** [C/C++ リファレンス] www.cppreference.com/ (英語) www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない) [禿 Stroustrup] public.research.att.com/~bs/ [C++ International Standard] www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110 [JTC1/SC22/WG21 - C++] www.open-std.org/jtc1/sc22/wg21/ ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。 [JIS X3014] www.jisc.go.jp/app/pager?&RKKNP_vJISJISNO=X3014 ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:55:14 ] ■Books(Templateまわり)■ Effective STL www.amazon.com/exec/obidos/ASIN/0201749629/ www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳) Modern C++ Design www.amazon.com/exec/obidos/ASIN/0201704315/ www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳) C++ Templates www.amazon.com/exec/obidos/ASIN/0201734842/ C++ Template Metaprogramming www.amazon.com/exec/obidos/ASIN/0321227255/
4 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:55:56 ] ■Libraries■ [Boost] Boost www.boost.org/ (日本語) www.kmonos.net/alang/boost/ (日本語) shinh.skr.jp/boost/ [標準ライブラリ] SGI-STL www.sgi.com/tech/stl/ STLport stlport.sourceforge.net/ GNU libstdc++ gcc.gnu.org/libstdc++/ Apache STDCXX incubator.apache.org/stdcxx/ STLFilt www.bdsoft.com/tools/stlfilt.html (日本語) www005.upp.so-net.ne.jp/episteme/html/stlprog/ (日本語) www.wakhok.ac.jp/~sumi/stl/ [Loki] sourceforge.net/projects/loki-lib/ LokiPort-MSVC6sp5 fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
5 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:56:33 ] STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
6 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:58:15 ] 前スレ C++相談室 part61 pc11.2ch.net/test/read.cgi/tech/1205059063/
7 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:58:27 ] 1乙
8 名前:仕様書無しさん mailto:sage [2008/05/28(水) 00:01:06 ] 1乙
9 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 00:11:09 ] ・(明示的・暗黙共に)コンストラクタ、デストラクタを定義していないこと → 親クラスが無いもしくは親もPOD型であること → メンバ変数が全てPOD型であること → 仮想関数を持っていないこと でPOD型になるはず。 unionに突っ込んでコンパイル出来たらOK。
10 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 00:13:08 ] え、コンストラクタ持ってたら POD じゃないのん?マジ?
11 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 00:16:29 ] unionに突っ込んだ時に初期化で困るべ。
12 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 00:18:56 ] なるほど、超納得。
13 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 09:16:22 ] 暗黙のコンストラクタってコンパイラが勝手に作るやつ?
14 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 09:26:30 ] >>9 暗黙定義のコンストラクタで POD じゃなくなるなら、 POD struct なんか作れないことになるぜ。
15 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 09:37:07 ] 非explicitなコンストラクタのことじゃないの?
16 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:07:22 ] >>14 暗黙の空の実装のコンストラクタは、 「コンストラクタが無い状態」というふうに思ってくれ。 分かりやすくかつ適切な言葉が見つからなかったんで。 実際、union内のPOD型は、空のコンストラクタすら 呼ばれている事にはなってないしね。
17 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:16:53 ] >>16 それなら条件としては「明示的にコンストラクタ、デストラクタを宣言していない」でいいでしょ。 あーあと、コピー代入演算子も宣言しちゃだめな気がする。
18 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:20:25 ] >>17 「明示的」じゃ駄目なんだ。 空ってところが重要だから。
19 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:24:40 ] >>18 え? POD の条件にコンストラクタやデストラクタが空かどうかが関係あるの? 宣言した時点でアウトなはずなんだけど。
20 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:31:15 ] 明示的なコンストラクタが無くても、 暗黙の空でないコンストラクタが作られたら駄目ってこと。
21 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:41:19 ] コンストラクタを必要とする(=非PODの)データメンバを持つ、以外に 暗黙のコンストラクタが生成される条件を思いつかないが。 あ、もちろん、仮想関数を持つなら必要だが。
22 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:43:01 ] あ、constメンバや参照メンバというのもあるな。 つっても、これは コンストラクタ(コピーコンストラクタ)や代入演算子が 「暗黙には作られない」だけかもしれないが。
23 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:47:17 ] >>21 以外もなにも、それであってるよ。 >>9 の矢印部分で書いた、 暗黙の空でないコンストラクタが作られる要因。
24 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:54:59 ] 仮想継承も? あんまり使わないけど
25 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:59:02 ] >9 がややこしいんだよ。矢印部分3つそろっててもコンストラクタ宣言してたら POD じゃないし、そもそも「コンストラクタが無い」っていう認識も規格上はそうなって ないわけで無理が出てくる。 クラス型が POD であるためには以下すべての条件を満たすこと。 ・明示的にコンストラクタ、デストラクタ、コピー代入演算子を宣言していないこと ・基底クラスおよび非 static データメンバがあればすべて POD 型であること ・仮想関数を持たないこと これでいいでしょ。 仮想継承は、インスタンスごとの情報としてポインタメンバいっこと同等に POD として 実装できそうな気がする。
26 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 13:01:45 ] >>24 たしか仮想継承も駄目だったはず。 昼休みオワタので去りまする。
27 名前:25 mailto:sage [2008/05/28(水) 13:04:07 ] んー前スレ最後に貼ってもらった規格の引用と比べると、 >25 でも微妙な違いがいろいろ あるなぁ。継承した時点で POD じゃないっぽい。非 static データメンバについては private/protected もダメ。 やっぱり正確なところは規格を見るのが一番ってことだねぇ。
28 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 13:26:01 ] 理解させるために分かりやすく書いた説明と 厳密に伝えるための説明では目的が違うだろ >>9-12 の流れは前者 >>14-15 は後者 規格には理由や経緯が書かれてないこともあるしな 要するにD&E最強
29 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 21:07:43 ] >>16 POD 型のデフォルトコンストラクタは0初期化するよ。 ただ、POD 型の変数を宣言しても そのデフォルトコンストラクタも何も呼ばれない、というだけ。
30 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 22:38:46 ] デフォルトコンストラクタって0クリアしないんじゃないの?
31 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 22:48:06 ] #include <iostream> struct X { int a, b; X() : a() {} }; int main() { X x; std::cout << x.a << std::endl; std::cout << x.b << std::endl; return 0; } 出力は 0 4262272
32 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 00:58:06 ] >>29 >>31 ビルトイン型のT()は0初期化の別記法なので、 デフォルトコンストラクタとは呼ばない テンプレートのために、ユーザー定義型のデフォルトコンストラクタと 同じ記法が使えるようにしてあるだけ [6.2.8] The value of an explicit use of the constructor for a builtin type is 0 converted to that type (§4.9.5). Thus, int() is another way of writing 0. For a userdefined type T, T() is defined by the default constructor (§10.4.2), if any. The use of the constructor notation for builtin types is particularly important when writing templates. Then, the programmer does not know whether a template parameter will refer to a builtin type or a userdefined type (§16.3.4, §17.4.1.2).
33 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 00:59:51 ] 以下のコードなのですが、gcc3.4.4だと could not convert template argument 'a' to 'void*' と怒られます。 VC9.0では問題なくコンパイルが通ります。 どちらの動きが正しいのでしょうか? template<void* T> class A { }; void f(){} int main(void) { A<f> a; return 0; }
34 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 01:05:16 ] まず、本やWebサイトでテンプレートの基本を勉強すべき
35 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 09:35:47 ] >>33 関数のアドレスを渡したいなら template<void(*T)()> では?
36 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 14:48:23 ] >>33 標準規格では、関数へのポインタから void* への変換は 認められてない筈。 VC は独自にこれを許してるけど。
37 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 15:38:09 ] struct X { int x; }; X func() { return X(); } と定義したとき、 X().x = 0; は「左のオペランドが、左辺値になっていません」というエラーが出るのに func().x = 0; がエラーにならないのはなぜですか?
38 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 15:58:25 ] 規格でそうなのか、君の処理系特有のことなのか、俺は知らんけど、 とりあえず自分の処理系書いたほうが問題が整理されやすいんじゃないかな。
39 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 16:08:01 ] >>38 すみません。試したのは VC8 のみです。
40 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 16:30:09 ] >>33 関数のアドレスでなく、traitsを受け取るべき。
41 名前:33 mailto:sage [2008/05/30(金) 00:29:37 ] みなさんありがとう。
42 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 04:43:07 ] >>37 コンパイラは何? 規格ではどちらもOKのはず。
43 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 12:46:33 ] >>42 >>39 でも書きましたが VC8 です。 規格では非左辺値構造体の組み込み型メンバーでも書き込みOKということですか?
44 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 13:03:06 ] 一時オブジェクトでも左辺値になれるだろ
45 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 13:23:39 ] >>44 え?一時オブジェクトは右辺値だろ? 一時オブジェクトが左辺値だったら他に何が右辺値になるんだ?
46 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 17:41:55 ] どちらも問題ないでしょ。一時オブジェクトは副作用が完了した時点で無効になるだけだから。 寧ろ、>37の「エラーが出るのに」という根拠を知りたい。
47 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 17:43:49 ] VC9でも>>37 と同じエラーが出た。 どうもバグっぽいね
48 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 18:51:51 ] 1 + 2 = 0 ができないのは対称性が悪い。
49 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 19:03:15 ] それは違う。
50 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 19:15:40 ] >>37 func().x = 0;がエラーにならないのって、 XがPOD型のときだけっぽい。
51 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 19:37:48 ] ・コンストラクタを付けるだけ(PODでなくなる)で、 func()経由でも出来なくなる。 struct X { int x; X(){} }; ... X().x = 0; //エラー:左のオペ(ry func().x = 0; //エラー:左のオペ(ry ・関数経由だと、どちらでも出来る。 struct X { int x; X(){} int& xref(){return x;} }; ... X().xref() = 0; func().xref() = 0; 誰か仕様詳しい人・・・
52 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 19:56:00 ] 逆に POD の時にエラーにしてほしい。意味のない操作になるから。
53 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 02:12:49 ] >>33 うちではvc9は重すぎて入れてないので検証できないのだが、 なんでvc9だと通るんだ?? template <void * P> class A {}; void *f() { return NULL; } int main() { A<f()> a; return 0; } だったらわかるけど。
54 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 02:13:29 ] >>36 自己レス。すまん、これか! ほほぉ。ややこしいねぇ
55 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 19:52:42 ] >>32 >ビルトイン型で明示的に「コンストラクタ」を使って得られる値は >0 をその型に変換した値になる、 と、「コンストラクタ」と書かれているわけだが。 んで引数なしだから明らかにデフォルトコンストラクタだろ。
56 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 21:07:16 ] 初期化が終わっていないオブジェクトへの参照を関数へ渡すのは合法ですか。 その関数の中では、その参照からアドレスを得るか他の参照変数を初期化する操作しかしないとして。
57 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 00:09:19 ] 前スレでもその話は出てて、アドレスや参照の保持だけなら問題無いだろう、 って言われてるけど、規格書レベルでの合法かどうかのソースは出てない。 規格書で保証があるなら、俺も知りたい所。
58 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 12:49:04 ] 状態によって処理を変えたい時、Stateパターンで実装する方法と、enumとif文を使って実装する方法があると思います。 あとで状態の種類を増やしたくなった時、Stateパターンの方が保守しやすいと思っているのですが、 私が見てきたサンプルコードでは、enumを使っている例が多く感じます。 この2つの実装方法は、どのような事を考えて使い分ければいいのでしょうか?
59 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 17:54:50 ] stateパターンてどんなの?
60 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:19:05 ] 状態ごとにオブジェクトを作りそれに動作をにまとめ、切り替える。
61 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:43:31 ] (1)とりあえずswitch 状態の数少ないし、stateにしてクラス数増えるのもしんどいし あんまり変更もなさそうだからenumでswitchしちゃえ 増えるようならstateに書き直そう (2)能力不足 state間で情報を共有する美しい方法が思いつかない グローバル変数使うとアイツが怒るし・・・ そうだ、enumでswitchしとけば全部同一クラス内だから問題ナシ
62 名前:58 mailto:sage [2008/06/04(水) 12:33:24 ] >>61 どうもです。 小規模なものならenumで十分ということですか。 state間で情報共有ですが、各stateに親クラスへのポインタを持たせて〜っていう方法では、 getter/setterが増えてしまうのが問題ということでしょうか。
63 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 18:20:21 ] class X { int x; friend class Y; }; class Y { int y; Y(X a) : y(a.x) {} }; のようにメンバ変数の初期化で private にアクセスできるでしょうか?
64 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 18:26:49 ] friend class Y; されてるんだから、YからXの中は丸見えだ。
65 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 20:42:00 ] Wから xの Yが丸見えだと? ごめんなんでもない
66 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 21:26:45 ] また懐かしいネタを・・・w
67 名前:デフォルトの名無しさん [2008/06/05(木) 10:33:50 ] kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6797.txt buffonの針のシミュレーションでπを求めるプログラムなんですけど Borland C++ Compilerでコンパイルすると C:\borland\bcc55\src\C++>buffon.exe Length of needle (0<L<=1): 1 Drop total of needle : 100 Number of hits = 55 Pi = 3.63636 という風にシミュレーション結果が出るんですが、 同じソースをcygwin g++(version4.2.4)でコンパイルすると $ ./a.exe Length of needle (<=1): 1 Drop total of needle : 100 Number of hits = 100 Pi = 2 という風におかしなシミュレーション結果になってしまうんですが、何が原因なんでしょうか?
68 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:26:10 ] >>67 y座標の乱数生成に問題がある。 rand()関数が返す値の最大値は定数RAND_MAXで判るけど、 これが65536前後しかないコンパイラは多数ある。 その式だとy座標には0か1しか返ってこない。
69 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:55:10 ] >>68 アドバイスありがとうございます。 ちゃんと動くようになりました。
70 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 19:41:00 ] クラスのtemplate化を考えています。 それで、templateで指定する型の取りうる範囲 を調べたいのですが、何か良い方法はありませんでしょうか? template<T> (略) public: int str[Tの取り得る範囲]; 内部にこういう変数の宣言に関してもあるので・・・。
71 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 19:44:08 ] 可算で上下限のある型なんて限られてるんだから特殊化すればいいだろ。
72 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 19:45:13 ] long longとか指定されたらどうするの?死ぬの?
73 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:05:30 ] std::numeric_limitsのmin(), max()
74 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:18:10 ] 禿も禿本で言ってるな numeric_limitsの特殊化も提供しろって
75 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 15:56:46 ] MinGWとVC++との連携を考えてて 下記みたいなソースを考えた。 GeoOpen関数へ引数無しだとちゃんとreturnされてくるんだが、 引数を作るとエラーが起こっちゃうんだよ。 printfはちゃんとされてるからまさにreturnでエラーが起こってる様子。 ちなみにエラー文はコレ↓ 「The value of ESP was not properly saved across a funciton call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.」 なんぞこれーー コンパイラが違うから起こってるエラーなのか。。。 ■MinGW側cpp(DLL作成側) extern "C" __declspec(dllexport) int __stdcall GeoOpen(int inta) { printf("%u", inta); return 1; } ■VC++側cpp(DLL読み込み側) GEOOPEN geoOpen = (GEOOPEN)GetProcAddress(hGEOCODERDLL, "GeoOpen@4"); if (geoOpen != NULL){ int intRes = (*geoOpen)(testInt); }
76 名前:デフォルトの名無しさん [2008/06/06(金) 15:58:29 ] ちなみにVC++のヴァージョンは6.0 もしかしてスレチなのかな。
77 名前:デフォルトの名無しさん [2008/06/06(金) 16:00:59 ] しまった記述し忘れ。 ■VC++側cpp(DLL読み込み側) testInt = 1;
78 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 16:05:27 ] GEOOPENの定義は?
79 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 16:07:09 ] C++にはDLLなんて概念ないしスレ違いだが まあ呼び出し規約が一致してないんじゃないかなあ。
80 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 16:07:44 ] GEOOPENのtypedeで__stdcallを忘れているんじゃない
81 名前:デフォルトの名無しさん [2008/06/06(金) 16:13:25 ] >>78 typedef int (* GEOOPEN)(int); です。 >>79 やはりスレチでしたか。 失礼を。
82 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 16:16:12 ] >>80 ぐほー! 正にその通りでしたっ ありがとうございます!
83 名前:デフォルトの名無しさん [2008/06/07(土) 05:17:16 ] templateの型を強引にunsigned形式にキャストしたいんですが どうやれば良いのでしょうか? (unsigned T)num; はエラーになってしまうので・・・。
84 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 05:32:20 ] Boostのmake_unsignedを使う。 あるいは自分で同等のメタ関数を書く。
85 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 05:43:10 ] 質問です ゲームを作るときに速度や位置といったよく変更するものは一箇所のヘッダーにまとめたほうがいいのでしょうか それとも、その値を使うヘッダーごとに分けたほうがいいのでしょうか 前者だと、変更するたびにコンパイルの時間が長くなるし、 後者だと、書いてるヘッダーを探す手間が増えるというように、 長所と短所があるのでアドバイスをお願いします
86 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 06:19:35 ] >>73 固定配列のサイズ指定でmax() の戻り値使うと、可変長配列にならね? C99なら問題無いけど、C++だと規格上不正のような気がする。 とはいえGCC4は通っちゃったので俺が間違ってるのか >>70 boost使えるのならこういうのがあるYo boost::integer_traits<T>::const_max
87 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 10:03:09 ] >>85 定義ファイルから読み込む
88 名前:83 mailto:sage [2008/06/07(土) 12:18:14 ] >>84 レスありがとうございます。 boostは環境で使えないので メタ関数を書いたのですが・・・ template <typename T> struct add_unsigned { typedef unsigned T type; }; で、エラーが出ます。 unsignedではなくconstなどでは問題なくコンパイル通るのですが・・・
89 名前:83 mailto:sage [2008/06/07(土) 12:24:42 ] 力ずくですが template <class T> struct add_unsigned{ typedef T type; }; template <> struct add_unsigned<char>{ typedef unsigned char type; }; template <> struct add_unsigned<wchar_t>{ typedef unsigned int type; }; template <> struct add_unsigned<int>{ typedef unsigned int type; }; こんな感じで解決する事にしました。 どうもありがとうございました。
90 名前:85 mailto:sage [2008/06/07(土) 15:55:13 ] >>87 定義ファイルだとユーザが変更出来るという点が気になって使ってなかったんですが、 気にしなくていいのでしょうか それとも配布前にコードに埋め込んで配布という形を取るのでしょうか
91 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:54:34 ] >>85 ヘッダで宣言してソースで定義すればいいんじゃないの?
92 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 17:50:01 ] >>90 コードに埋め込めばユーザーが変更できないとでも?
93 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:03:16 ] >>91 俺もそれ思ったけど、 定数自体よく増えそうじゃね? その場合、定数取得用の関数に文字列渡して ソースの方でマッピングするくらいしか無いと思う。 マクロ使って、開発中は関数+文字列渡しで、 リリース時は本当の定数にするのも手だけど、 うまいマクロ書けずに諦めた。
94 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:29:25 ] 潤沢なCPU資源のある今の時代、別に毎回文字列をmapから探しても大して問題はないと思うな。 適当なテキストファイルにa=bの形式でひたすら列挙したものを読み込むクラスとか、そんなに手間でないし便利だから作っておくといいんじゃね? 俺は保存とかコメント付けもしたいからxml使ってるが。
95 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:42:44 ] おれは>>91 の方法だな >>93 は同じような文字列(宣言と定義)を2箇所に書くのがいやだとかそういう話?
96 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:21:47 ] >>95 じゃなくて、値だけがよく変わるならそれ(cppの書き換えだけ)で良いけど、 定数が増える場合は宣言も当然追加しないといけないので、 ヘッダ書き換える事になって、 結局includeしてる全cppがコンパイルし直しになるな、と。 まぁ、>>85 が定数増やすこと有るかどうか分からないけどね。
97 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:25:14 ] ヘッダ一つに定数一個だけ宣言して 定数使うソースは使う定数の分だけヘッダをインクルードすればいいんじゃね?
98 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 22:40:18 ] BCC 5.5.1であるテンプレートクラスの変数をメンバに持つクラスがいて、このクラスのヘッダの段階では テンプレート引数にくるクラスが前方宣言されただけの時コンパイラに未定義の構造体と警告されてしまいます。 でもcppの方で実際の定義が分かるので、一応コンパイルは通ってるみたいなんですが、 コンパイラを黙らせるにはどのように書くのが良いのでしょうか? ヘッダ class hoge; class piyo{ sokuseki_ptr<hoge> hoggee; }; ソース struct hoge{ 〜 } (hoggeeの使用)
99 名前:デフォルトの名無しさん [2008/06/07(土) 23:27:42 ] C++でDLL作成に挑戦しています 公開するAPI関数の定義(XXX.h)を extern "C" {} ブロックで囲っているのですが、 関数の本体(XXX.cpp)も同じように extern "C" {} ブロックで囲う必要があるのか分かりません もちろんインターネットで検索をかけていますが、今のところ有用な情報がないです 両方とも囲う必要があるのか教えてください
100 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:36:28 ] >>99 試してみれば?
101 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:45:59 ] >>100 コンパイルは通りました defファイルも作成できました しかし、これで正しいのかが分からないのです
102 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:48:23 ] >>98 BCB2007の付属品のBCC5.9.3では何のエラーも警告も出ない。 5.5.1のバグというか癖では?