- 1 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 15:29:45 ]
- エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。 ※sageは禁止です。 【前スレ】 【初心者歓迎】C/C++室 Ver.36【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1175436073/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 175 名前:54 mailto:sage [2007/05/14(月) 22:58:24 ]
- >>171
なるほど。そのとおりでした。 サンクス。
- 176 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 23:01:02 ]
- >>173
試しにその行を削除するなりコメントアウトするなりしてコンパイルしてみろ たぶんエラー吐くから
- 177 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 02:58:46 ]
- >>168
そのルールでいくと、自分の型のポインタか参照を返すようなメソッドは すべて下位クラスで再定義する必要がある。 ('return *this' だけのメソッドは特別なんていうルールを採用する?) ちなみに、以下のようなプログラムではどんな結果になるべき? void prt3(A* obj) { printf("prt3(A)\n"); } void prt3(B* obj) { printf("prt3(B)\n"); } class A { public: A() {} virtual void prt() const { printf("A::prt\n"); } void prt2() const { printf("A::prt2\n"); } // thisの型はA?,B? return時だけB? A& geta() { prt(); prt2(); prt3(*this); return *this; } }; class B : public A { public: B() {} virtual void prt() const { printf("B::prt\n"); } void prt2() const { printf("B::prt2\n"); } }; int main() {B b; b.geta(); } 結果 B::prt ?::prt2 prt3(?)
- 178 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 03:35:58 ]
- *thisをthisにしてVC2003でコンパイル
結果: B::prt A::prt2 prt3(A)
- 179 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 18:49:47 ]
- VS2005,XPです。
HWND hwnd; RECT rc; GetWindowRect(hwnd,&rc); if ((rc.bottom-rc.top) == GetSystemMetrics(SM_CYCAPTION)) うまくいかないのですが、こういう比較の仕方は使えないのでしょうか? 使えない場合、どのように直せばいいですか?
- 180 名前:デフォルトの名無しさん [2007/05/15(火) 19:33:30 ]
- クラスなどを使って、通常存在しないサイズの変数にアクセスできませんか?
int型の変数を24と8ビットに分けて使うような x.aは24bit x.bは8bit として使いたいんですが
- 181 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 19:33:42 ]
- >>17
D&Eには、できるようにしたところでメリットがない(オーバーライドできる仮想関数がない)し、 Cの型変換のルールが混沌としていて内蔵型をクラスとして扱おうとしてもうまくいかないと、 そうできるようにしなかった理由が書かれている。
- 182 名前:180 [2007/05/15(火) 19:34:31 ]
- 代入、参照が普通の変数のように出来る方法を教えてください
- 183 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 19:35:55 ]
- >>180
どうしてもやりたいなら、ビットフィールドがその目的に使える。 但し、移植性を大きく損なうことになりかねないので注意。
- 184 名前:デフォルトの名無しさん [2007/05/15(火) 19:40:06 ]
- >>183
サンクス!!!
- 185 名前:デフォルトの名無しさん [2007/05/15(火) 19:59:46 ]
- >>183
すみません boolとcharだとどっちを使った方がいいとかありますか??? struct A{ char n : 1; char m : 7; }; struct A{ bool n : 1; bool m : 7; };
- 186 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:02:53 ]
- >>179
何をしたいのか分からんが、使える。
- 187 名前:185 [2007/05/15(火) 20:07:05 ]
- 自己解決しました
移植性を考慮して、unsigned char n : 1; にしておきますね
- 188 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:10:51 ]
- 移植性が欲しいならunsigned intにしておけ
- 189 名前:デフォルトの名無しさん [2007/05/15(火) 20:12:37 ]
- >>188
サイズは出来るだけ削りたいんです 上の例では32bit使っていますけど 8bit以内ならcharのほうが削れます
- 190 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:13:25 ]
- ビットフィールドに使えるのはsignedかunsignedのintだけ。
- 191 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:15:54 ]
- ビットフィールドの移植性って実のところどうなの?
一応、標準だよね?
- 192 名前:デフォルトの名無しさん [2007/05/15(火) 20:16:15 ]
- bcc(c++)だと使えますけど
- 193 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:21:35 ]
- >>192
処理系依存で他の型が使えても構わないことにはなっている。
- 194 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:22:42 ]
- C++ならほとんどの整数型が使えるだろ。
- 195 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:31:15 ]
- >>189
unsigned charがビットフィールドに使える処理系で、 同じ8ビットのビットフィールドでもunsigned intにするかunsigned charにするかで 違いが生じるなんて話聞いたことがない。
- 196 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:42:39 ]
- >>195
#include <iostream> template<typename T> struct S { T a: 1; T b: 7; }; int main() { std::cout << "sizeof(S<unsigned int>) = " << sizeof(S<unsigned int>) << std::endl; std::cout << "sizeof(S<unsigned char>) = " << sizeof(S<unsigned char>) << std::endl; } g++だと違う結果になったが。
- 197 名前:デフォルトの名無しさん [2007/05/15(火) 20:42:42 ]
- >>195
違いますけど・・・ #include <stdio.h> int main(void){ struct A{ unsigned int m : 1; unsigned int n : 7;}; struct B{ unsigned char m : 1; unsigned char n : 7;}; printf( "%u\n", sizeof(struct A) ); printf( "%u\n", sizeof(struct B) ); return 0;}
- 198 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 20:51:15 ]
- VC8で確認。こちらも違った。
- 199 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 21:54:53 ]
- VC7.1でも違った。
- 200 名前:デフォルトの名無しさん [2007/05/15(火) 21:58:58 ]
- ふつう違うよな
int とchar 一バイトと四バイトだんもんな
- 201 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 22:01:29 ]
- その理屈はおかしい。
- 202 名前:デフォルトの名無しさん [2007/05/15(火) 22:29:47 ]
- BCC55で次のソースをコンパイルするとリンカがエラーを出すのですが、
私は何を誤っているのでしょうか? どう直せばよいか教えていただけないでしょうか。 ●ソース #include<iostream> class Singleton { public: static Singleton getInstance() { if(&singleton == '\0') { singleton = *(new Singleton()); std::cout << "Created!" << std::endl; } else { std::cout << "Not Created!" << std::endl; } return singleton; } ~Singleton() {} private: static Singleton singleton; Singleton() {} }; int main() { Singleton s1 = Singleton::getInstance(); Singleton s2 = Singleton::getInstance(); }
- 203 名前:202 [2007/05/15(火) 22:31:15 ]
- エラーの内容は次の通りです。
●コマンドラインとエラー X:\>bcc32 -nX:\data\bin -5 -f X:\data\src\Singleton.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland X:\data\src\Singleton.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル 'Singleton::singleton' が未解決(X:\DATA\BIN\SINGLETON.OBJ が参照)
- 204 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 22:33:49 ]
- 一時オブジェクトとして使うならコンストラクタ呼び出さないと駄目ぽ
Singleton()::getInstance();
- 205 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 22:39:53 ]
- static変数の実体がないって怒ってるわけなんだが…
そんなことよりも、何もかもが誤りだから ポインタと参照とシングルトンの勉強をしたほうがいいと思うよ。
- 206 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 22:41:02 ]
- >>202
クラスの静的メンバ変数は、外部で定義しなければならない。 Cのグローバル変数がヘッダで宣言して、どこか1ヶ所で定義するのと同じ理屈。 それはともかくマルチスレッドを考慮しないのなら、単にこうでいい。 class Singleton { public: static Singleton getInstance() { return singleton; } ~Singleton() {} private: static Singleton singleton; Singleton() {} }; static Singleton Singleton::singleton; マルチスレッドを考慮するなら、Singletonはポインタ、 当然std::auto_ptrやboost::scoped_ptrあたりにすべき。
- 207 名前:202 mailto:sage [2007/05/15(火) 23:07:21 ]
- >>204-206
有難うございます。 マルチスレッドやboostのライブラリは当分手を出しません。 コマンドラインアプリをある程度満足に作れるようになってから先に行きます。 まだポインタの使い方も習得できてないわけですし。 ずっとJavaをやってきたんですが、アレは全部参照扱いだから ポインタと実体を意識するシーンは限定されてたんですが、 C++はそうでないから難しいです。 C++プログラマにJavaを教える本はあるのに、その逆はないんですよね。 仕事ではないので、手探りでなんとかやっていこうと思います。
- 208 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 23:12:41 ]
- Accelerated C++マジオヌヌメ
- 209 名前:206 mailto:sage [2007/05/16(水) 00:07:44 ]
- >>206
getInstanceがSingletonへの参照を返すようにするのを忘れていたorz 正しくはこう class Singleton { public: static Singleton& getInstance() { return singleton; } private: static Singleton singleton; Singleton() {} Singleton(const Singleton&); ~Singleton() {} Singleton& operator =(const Singleton&); };
- 210 名前:202 mailto:sage [2007/05/16(水) 01:31:34 ]
- >>208
Amazonのレビューによると、 既に他言語の知識がある人間にとって丁度良い本のようですね。 店頭で探してみます。 >>209 ありがとうございます。 operatorを使うんですね・・・。 まだ「パッと見」で、なぜこれがシングルトンを実現するのかが 分からないレベルなので、ソースを研究してみます。
- 211 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 01:44:03 ]
- Singleton(const Singleton&);
Singleton& operator =(const Singleton&); はインスタンスのコピーを禁止するためのちょっとした工夫だよ。 privateにする&処理の内容を記述しないことで、 コピーしようとしたらコンパイルエラーになるようにしてる。 あと、コンストラクタをprivateにしてるのも、 getInstance()以外で勝手にインスタンスを作られないようにするため。
- 212 名前:202 mailto:sage [2007/05/16(水) 01:58:23 ]
- >>211
ありがとうございます。 なるほど、インスタンスのコピー禁止も意識しないといけないんですね。 privateなコンストラクタについては、Javaも同じ手法なのでわかりました。
- 213 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 06:57:01 ]
- C++で読むデザインパターン
ttp://www.01-tec.com/document/cpp_design_pattern.html
- 214 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 09:59:08 ]
- XPです。
タスクトレイのアイコンを指定しても違うアイコン(赤い×マーク)が出るんですけど何故でしょうか? アイコンは32x32,256色と16x16,256色が入ってます。
- 215 名前:214 mailto:sage [2007/05/16(水) 10:36:34 ]
- ソース
nid.hIcon = (HICON)LoadImage(hInstance,MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0); リソース IDI_ICON1 ICON "1.ico" こんな感じで読み込んでます。 それとあともう一つお願いします。 タスクトレイのアイコンを右クリックしたらTrackPopupMenuという便利な位置指定できる関数がありますが、 右クリックメニューからダイアログなどのウィンドウを開いた場合のウィンドウ位置の指定はどうやるのがスマートでしょうか? タスクバーを移動してる場合にも、アイコン位置の角に表示させたいです。 それぞれの位置の場合の処理を書く必要があるんでしょうか?
- 216 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 10:51:57 ]
- そのアイコンを試しにクライアントエリアに描いてみては
位置指定は、、、思ったとおりにやってみなよ
- 217 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 13:59:23 ]
- struct base{};
template<typename T>struct drived:base{ template<typename TT>bool typecmp(){ return typeid(T)==typeid(TT); } }; base *p1=new drived<int> , *p2=new drived<char>; //で、base*からdrived::typecmpにアクセスしたい訳だが
- 218 名前:デフォルトの名無しさん [2007/05/16(水) 14:01:53 ]
- vipの方が人がいそうなので。
pc11.2ch.net/test/read.cgi/tech/1178432985/217 217 名前:デフォルトの名無しさん[sage] 投稿日:2007/05/16(水) 13:59:23 struct base{}; template<typename T>struct drived:base{ template<typename TT>bool typecmp(){ return typeid(T)==typeid(TT); } }; base *p1=new drived<int> , *p2=new drived<char>; //で、base*からdrived::typecmpにアクセスしたい訳だが これをやりたいんだけど、やっぱり原理的に無理だよね?
- 219 名前:218 mailto:sage [2007/05/16(水) 14:02:42 ]
- すみません、218は誤爆です
- 220 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 16:30:30 ]
- >>215
IDI_ICON1の値が問題な希ガス ヘッダでの#defineも晒したほうがいいとおも
- 221 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 16:48:29 ]
- >>217
お勧めはしないがdynamic_cast<derived<int>*>(p1)->typecmp<int>()
- 222 名前:デフォルトの名無しさん [2007/05/16(水) 21:35:09 ]
- kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3988.txt
誰か応えてください。
- 223 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 21:57:45 ]
- >>222
よく読んでないけど、delete p;は実行されないと思うぞ 配列はmain関数側で作って渡した方がいいと思うぞ
- 224 名前:デフォルトの名無しさん [2007/05/16(水) 22:00:19 ]
- あ、やっぱりそうですか。
・・・あ、なるほど、思いついた ありがとさんでした
- 225 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 23:27:10 ]
- >>221
仮想関数無いと dynamic_cast って効かないんじゃない? >>217 new drived した直後なら static_cast でいいだろう。 やっぱりお勧めはできないんだけども。
- 226 名前:202 mailto:sage [2007/05/16(水) 23:39:03 ]
- >>213
ありがとうございます。 こういうサイトは良いですね。 今は鯖落ちしてるようで、キャッシュを見ていますが・・・。
- 227 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 23:51:44 ]
- なんで実行時に決まる子の型を、コンパイル時判定で
親が使いたい、なんて言う発想になるんだろう
- 228 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 23:54:10 ]
- vectorについてどなたか教えて下さい。
例えば、メイン関数で空のvectorを定義して 別の関数でその中に数値を代入したい場合には 何を渡して、何を仮引数にとってやればいいのでしょうか? あくまで別関数のreturnは0か1で返したく、別関数で代入するだけで メイン関数vectorの値を操作したいのです。 sub(?????) { こちらで値を入れたい } int main() { vector<int> Vint; sub(?????); } 何も入っていないためかiteratorを渡しても駄目でした。 またmain{sub(&Vint)}で、sub(vecter<int> *Vint){}でも 値の代入は出来ませんでした。困っていますよろしくお願いします。
- 229 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 00:01:12 ]
- >>228
一番最後のポインタを使った奴なら大丈夫なはず。 できなかったってのは、何をしたらどうなったんだ? ポインタのかわりに参照を使うのが C++ 的に適切。
- 230 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 00:02:35 ]
- >またmain{sub(&Vint)}で、sub(vecter<int> *Vint){}でも
>値の代入は出来ませんでした。 できるよ …気になったんだが、main の中で値を入れることはできるの? resize もせずに Vint[0] = 1; とかやってないよな?
- 231 名前:214 mailto:sage [2007/05/17(木) 00:38:52 ]
- ありがとうございます。
>>216 クライアントエリアにも赤い×マークが描かれました。 >>220 #define IDI_ICON1 103 です。
- 232 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 00:54:09 ]
- >>231
じゃあそういうデータなんだよ 複数の形式でアイコンが入ってるなら全部チェックしてみては
- 233 名前:214 mailto:sage [2007/05/17(木) 01:00:02 ]
- 自分で作ったアイコンなので赤い×マークなんて入ってないんですが・・・。
実行ファイルのアイコンとタイトルバー左上のアイコンも同じアイコンを使っていてそちらはちゃんと出ます。
- 234 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 01:54:58 ]
- んじゃOEMアイコンを読んでるんだな。
hInstanceがNULLだったりしないか?
- 235 名前:214 mailto:sage [2007/05/17(木) 02:08:59 ]
- ビンゴでした。
すいません、どうもありがとうございました。
- 236 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 04:06:34 ]
- VC++で
ULONGLONG x = 0; x += 10000000 * 60 * 60 * 3; ULONGLONG y = 0; y += (ULONGLONG)10000000 * 60 * 60 * 3; if (x != y) cout << "Different" << endl; とするとxの方はオーバーフローになってxとyが違う数字になってしまうんだけど 64ビットコンパイラではこれは起こらないんだよね? この辺の仕様について 書いてあるページとか無いだろうか?
- 237 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 04:17:24 ]
- >>236
intが64bitなら起きないけど、VC++の64bitターゲットはintが32bitな ので、起きる。 ページは知らね。探してないけど、Cの規格書にあるはず。
- 238 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 04:35:12 ]
- 整数定数は(特に記述が無ければ)int。
int同士の演算はintで行われ、結果もint。 これはどんなコンパイラでも一緒。 つまり、>>237の通り。俺もページは知らないが。
- 239 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 05:33:31 ]
- VIPPERが意外と侮れない
昨日VIPでレスついてた 130 名前:以下、名無しにかわりましてVIPがお送りします。[] 投稿日:2007/05/16(水) 14:52:36.04 ID:G4TJRFdQ0 struct base { private: virtual bool typecmp( const type_info &typeinfo ){ return false; }; public: template<typename TT> bool typecmp(){ return typecmp( typeid(TT) ); }; }; template<typename T> struct drived : public base { public: virtual bool typecmp( const type_info &typeinfo ){ return typeid(T) == typeinfo; } }; こんなんでどうだい?
- 240 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 07:35:47 ]
- >>229-230
一番下ので可能とのことで、もう一度やってみます。 resizeというものに関しては知らなかったです。 どうもありがとうございました。
- 241 名前:デフォルトの名無しさん [2007/05/17(木) 11:28:44 ]
- char *strという変数に文字列を格納するのを関数で行う場合
どういう渡し方すれば良いんでしょうか?
- 242 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 11:29:48 ]
- hoge(char *dst, int dst_size)
- 243 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 11:49:19 ]
- >>241
その変数に、文字列は格納できない。
- 244 名前:241 mailto:sage [2007/05/17(木) 11:56:44 ]
- あれ?文字列を格納するのって
char str[50]="hoge"; char *str="hoge"; の二種類でやるのではないのですか? C言語は今日から勉強し始めたので激しく狂ったこと言ってたらすいません。
- 245 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 11:58:10 ]
- おとなしく、配列とポインタの関係あたりを勉強してからにしろ。
- 246 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 14:23:09 ]
- if(a==b)とif(b==a)って同じですか?
- 247 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 14:24:50 ]
- >>246
それがC++で特殊な演算子オーバロードされていると言うことがないなら、同じ。
- 248 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 14:29:06 ]
- a, b の型が異なっても同じだったけ?
int と long とか double と int とか
- 249 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 14:40:08 ]
- >>248
promotion rule に従うってだけで同じじゃね?
- 250 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 17:31:45 ]
- mallocはnew、freeはdeleteに置き換え可能だと思いますが、
reallocはどうしたらいいでしょうか。(STLのコンテナ使え、は無しで
- 251 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 17:42:35 ]
- >>250
STLのコンテナを使わない理由を調べ、その理由如何では敢えてnew/deleteに置き換えずにそのままrealloc()を使うべし。
- 252 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 17:43:48 ]
- C++の機能に置き換えるというなら、インラインアセンブリでシコシコ
- 253 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 18:06:40 ]
- つplacement new
- 254 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 18:56:04 ]
- >>236
(ULONGLONG)10000000よりも10000000ullのほうがすっきり
- 255 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 19:13:51 ]
- 意味が違うだろ。
- 256 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 20:26:09 ]
- scanfでdouble型変数に数値を入力し、その数値を1/2,1/4,1/5の値を出力するプログラムを作成
したいのですが、どのようにして作ればいいのでしょうか?
- 257 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 20:32:49 ]
- inline指定した関数がインライン展開されなかったとき、なんで警告が出ないの?
個人的には「この関数は現在の設定(orコンパイラ)ではインライン展開されません」という警告が低いレベルで出て欲しい。
- 258 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 20:37:56 ]
- それでデバッグビルド/サイズ優先ビルドで警告が出まくりか?
- 259 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 20:41:57 ]
- >>256
どこで躓いてるのか分からん。 scanfでint型変数に数値を入力し、その値を2, 4, 5倍して 出力するプログラムは作れるかい?
- 260 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:31:09 ]
- foo = !!bar;
という文を見たんですか、これは bar をboolにしてるだけで、 foo = (bool)bar; と同じですか?
- 261 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:36:14 ]
- C++で変態的な演算子定義をしていないなら。
(operator !だけ定義してあるとか)
- 262 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:42:02 ]
- >>259
いやつくれません
- 263 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:58:16 ]
- >>257
コンパイラ作成者に言え。
- 264 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 22:07:36 ]
- >>262
本買って勉強しよう
- 265 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 22:31:35 ]
- >>257
警告を出すようにできるものもあるぞ。例えばVisual C++。 /W4でも出てこず、/wで個別指定もしくは/Wallで出てくる。 msdn2.microsoft.com/ja-jp/library/yd3056cz(vs.80).aspx msdn2.microsoft.com/ja-jp/library/a98sb923(vs.80).aspx Borland C++Compilerでも警告が出た覚えがある。
- 266 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 22:33:39 ]
- VC++は-W4異常以上は標準ヘッダですら警告出たりして煩かったから
使ったことないなぁ 今はどうだか知らないが
- 267 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 22:39:57 ]
- なるほど。
独習C++で「展開されるか否かはコンパイラによる」って書いてあった気がしたから 低血圧な俺は心配しすぎで心拍数上がってぶっ倒れそうだったけど安心した。
- 268 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 22:52:02 ]
- >>266
標準ライブラリは滅多に出てこないが、 Boostなんかの外部のライブラリのヘッダではよく出てくるから、 #pragma warningが手放せない。
- 269 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 23:25:06 ]
- 自作の型に対し、プリミティブな型と同じような四則演算を行う場合って、
+ - * / % += -= /= %= ++ -- の12個全部定義しないとダメ?
- 270 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 23:38:45 ]
- boost::operatorsを使えば手間が省けるかと思う。
- 271 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 23:52:35 ]
- >270
boostに頼るのが現実的っぽいですね。ありがとうございました。 しかし、これを使わないとすると一体何パターン定義すればいいのやら……比較やら何やら。
- 272 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 00:02:31 ]
- 何の型かは知らんが、例えば同じ * でも
MyType * MyType、MyType * int、int * MyType は別定義かもしれんしな 後 const ありなしとか
- 273 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 00:16:17 ]
- 非メンバな演算子でもboost::operatorで定義出来るんですかいね?
- 274 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 08:22:41 ]
- >>273
クラス定義内で friend 関数を定義することで実現するみたい。
- 275 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 11:34:58 ]
- VC++2003にSP1あてたら強制コンパイル(Ctrl+F7)できなくなった
のですが、どなたか対処法知りませんか?
|

|