[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 07/16 11:48 / Filesize : 200 KB / Number-of Response : 824
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part61



1 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:37:43 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

331 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:10:44 ]
静的メンバ関数はextern "C++"ではない

332 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:11:10 ]
328は327に宛てたもんだと俺は思った、どうでもいいけど。

333 名前:329 mailto:sage [2008/03/27(木) 14:11:40 ]
>>330
ごめん。どこに突っ込み入っているのかすら理解できてない。
どこが嘘になってるの?

334 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:16:32 ]
>>331
何を根拠にそんなこと言うのか知らないけど、じゃぁ静的メンバ関数の
language linkage は "C++" 以外の何になるのさ?

335 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 16:56:26 ]
虚言癖というか妄想癖というか・・・なんかもう病気だね(汗

336 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 17:04:34 ]
>>334
静的メンバ関数のリンケージは内部リンケージで
その根拠は外部に公開されないから
逆にextern "C++"と同じという根拠は?

337 名前:デフォルトの名無しさん [2008/03/27(木) 17:05:02 ]
もうv(^・^)vの人はいないの?

338 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 17:20:53 ]
ちゃんと勉強しろ、そんな高度な話題じゃねぇよ

339 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 18:55:41 ]
コンストラクタの中で
配列宣言しているオブジェクトの
コンストラクタ引数を設定するにはどうしたらいいですか?



340 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 19:03:37 ]
class Test{
Test0 objects[10];
...
};

Test::Test()
:objects[0]( 10 )
,objects[1]( 8 )
...
{
}

こんなかんじをやりたいのです。
もちろん、これではエラーです

341 名前:デフォルトの名無しさん [2008/03/27(木) 20:36:48 ]
>>339
できないよ。

342 名前:デフォルトの名無しさん [2008/03/27(木) 20:51:07 ]
解答を待っているのかもしれないが、本当にできないから。
www.geocities.jp/ky_webid/cpp/language/012.html

343 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 20:57:51 ]
どうしてもそれっぽいことがやりたいなら
vector<Test>にひとつひとつpush_back()するか
ポインタの配列にしてひとつひとつnewすればいいんでないの

344 名前:デフォルトの名無しさん [2008/03/27(木) 21:55:56 ]
VC++6で
for(int i=0; i<10; i++){
...
}
for(int i=0; i<10; i++){
...
}
って書いたら
iの再定義っておこられた
拡張子cppになってるのに

345 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:57:25 ]
仕様です

346 名前:デフォルトの名無しさん [2008/03/27(木) 21:58:46 ]
1998年発売のソフトやもん。

347 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:59:23 ]
>>344
びっくりするくらいみんな知ってる。
規格準拠していないんだから何も問題ない。

348 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:01:35 ]
>>344
#define for if(0); else for

魔法のおまじない

349 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:01:59 ]
当時は準拠してたんだよ



350 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:03:21 ]
まだ規格もなかったのに何に準拠してたというのか。

351 名前:デフォルトの名無しさん [2008/03/27(木) 22:04:00 ]
常識。

352 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:29:04 ]
>324,329
だいたい、「関数ポインタ型」それ自体にはリンケージなんか無いだろ。
それともこーゆーコードが通るコンパイラでもあるのかっつーの。
typedef static void (*hoge)();
typedef extern void (*foo)();
typedef extern "C" void (*var)();

353 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:36:23 ]
typedef void (*__stdcall type)();

こういうのならたまにやる。

354 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:36:46 ]
それはリンケージじゃなくて呼び出し規約

355 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:48:31 ]
>>350
ARM、ISOのドラフト

356 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:49:53 ]
>>355
>>344 なていたらくでか

357 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:58:27 ]
>>356
forの中で定義した変数の有効範囲が
直後のループ本体に限られるようになったのは
結構遅かったのでは?D&Eでも軽く触れられていたし。

それに加え過去の互換性のためVC6はあれがデフォルトになったんだと思う。

358 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 23:27:37 ]
昔の人が考えた仕様には、頭おかしいだろうってのがそれなりに有るからね。

359 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 23:47:27 ]
初期のコンパイラの実装の都合もあったんじゃないかな?

最近のコンパイラで、forの変数の有効範囲が限られるようになってるのに最近気づいて思わずGJと叫んだ。




360 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:10:34 ]
>>357
まあ 1998 年と言えば規格が出る年だしな。
開発期間とか考えると多少前の仕様に準じようとしてたと考えるのが妥当だけど、
その時期ならドラフトとはいえかなりな部分まで練られてると思うんだけどな。
まあ、想像でしかないので本当にギリギリになって入れられた仕様なのかもしんないけど。

VC6 はテンプレートまわりがバグ持ちすぎてかなり酷いが、
テンプレートも遅くに入った仕様だからな・・・。
new がデフォで bad_alloc 投げないとか、とにかく色々と酷い上に、
しばらく次のコンパイラが出なかったという・・・。

361 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:18:58 ]
未だに古いライブラリとかで使わないといけないことが結構あるからねぇ
VS2005から入った俺としては結構苦痛
まあでもテンプレートさえなければインテリセンス反映が早いのはよい

362 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:36:24 ]
VC++6.0は当時の状況を考えればしょうがないと思う

問題なのは次のコンパイラがさっさと出なかった事
お陰で変に普及しちまって、このスレでもVC++6.0でコンパイルできません的な質問が絶えない

363 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:38:12 ]
全てはMSが次期製品を確実に買ってくれる為に図った陰謀。

364 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:53:13 ]
MSの事情的にはむしろ逆のような?
過去のシステムヘッダに, for で宣言した変数が
その後も生きることに依存したコードがあったっていう……

365 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:56:00 ]
#define for if(0) else for
のおまじないと使ったあとでATLをincludeすると
怒られるちゅーか

366 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:14:53 ]
>>363
そして満を持して登場した 2002 が糞だったという罠。
そして 2003 で大きく改善されるという二重の罠。
アカデミックだと無料アップグレードできないという三重の罠。

367 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:16:50 ]
#define for if(0); else for は色々やった後にやるとよろし。

368 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:55:57 ]
ってかincludeする前にundefするだろ・・・

369 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 02:11:01 ]
>>336,352
ややこしくて嫌になるが、内部とか外部とかがある「リンケージ」と
"C" とか "C++" とかがある「言語リンケージ」("language linkage") とは
別物。 >324,329 が言ってるのは言語リンケージのほうなんで、話がまるで
かみ合ってない。



370 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 03:12:43 ]
自信満々な>>336が可哀想に見えてきちゃったよw
逆にextern "C++"と同じという根拠は?ってのが哀愁をソソル

371 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 03:26:11 ]
>>336
素の「リンケージ」の話だとしてもおかしい。静的メンバ関数のリンケージは
ほとんど外部リンケージになる。例外は関数内のクラスのメンバの場合とかね。

372 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 03:29:08 ]
静的メンバ関数が「外部に公開されない」ってのもおかしいな。
クラスの宣言されたスコープや、クラス内での private なり public なりに
従うだろ、常考。

373 名前:デフォルトの名無しさん [2008/03/28(金) 03:50:38 ]
びやーんはもうC++なんか使っていないらしい。

374 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 05:40:45 ]
ソースは?

375 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 07:19:26 ]
2ch

376 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 08:03:31 ]
>>372
public, privateと内部リンケージ, 外部リンケージはまた別の話だ

377 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 08:07:53 ]
もう何がなんだかわからないよママン

378 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:26:26 ]
>>359
もともとがCへのトランスレータだった事を考えれば自然に合点が行くね。
for( int i = 0 ; .... ) { ... }
変換後
{
 int i ;
 for( i = 0 ; .... ) { ... }
}

379 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:47:14 ]
>>377
C++の仕様書を見ればいいと思うお



380 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:57:02 ]
>>372
リンカなどの外部に公開され得るのはクラスであって内部リンケージであるメンバが同様に公開されているように見えるのは処理系の都合

381 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 11:33:58 ]
>>380
クラスが外部リンケージを持つときに、メンバ関数が外部リンケージを持つかどうか は処理系依存だと言っているのならそれは違うよ

382 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 03:01:24 ]
>>377 >329,324

383 名前:デフォルトの名無しさん [2008/03/30(日) 01:04:01 ]
テンプレートをつかうと一気にコンパイル時間が10倍に?!

384 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 01:07:31 ]
>>383
>>5

385 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 15:11:26 ]
template使っても
型が1個と100個じゃ大違いだろ

386 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 15:17:08 ]
このテンプレいつの間にか一つのレスにまとめられてたのかw

387 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 15:27:00 ]
template <typename Questioner>
int IsCompileTimeBecomeLongerByUsingTemplate() {
return ENVIRONMENT_DEPENDENT;
}

388 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:25:46 ]
テンプレート無意味過ぎる

389 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:28:21 ]
>>388
質問者に応じて別の回答をするように特殊化するんだよ。



390 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:36:16 ]
template<> int IsCompileTimeBecomeLongerByUsingTemplate<教えて君>()
{
 throw spoon();
}


391 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:59:30 ]
匙は投げられた。

392 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 17:30:09 ]
the biggest news of the meeting was that we voted lambda functions and closures into C++0x.

// Writing a collection to cout, in C++0x:

for_each( w.begin(), w.end(),
[]( const Widget& w ) { cout << w << " "; } );


393 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 17:59:38 ]
スレ違い

394 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 01:28:23 ]
LRESULT CALLBACKの関数をCLASSに所属させるにはどうすればできますか?

395 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 01:37:29 ]
static

396 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 02:07:44 ]
>>394
web.archive.org/web/20070810174250/http://techtips.belution.com/ja/vc/0009/

397 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 05:36:51 ]
RTTIについて質問です。
RTTIありでオブジェクトファイルを生成したいが
外部libなどがRTTIを含んでいない場合は
自分側もそれにあわせてRTTIなしで組まなければ成らないのでしょうか?

398 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 10:26:48 ]
コンパイラオプションでRTTIを使うかどうかの設定の話なら、ケースバイケース。
自分が知るVC++では、外部のオブジェクトに対してtypeidやdynamic_castをしなければ、
自プログラムがRTTI有効でも、問題なくリンクして実行できる。
逆にそうでない処理系も世の中あるかもしれない。

399 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 12:28:13 ]
>>397
リンクでエラーが出たらオプション変えればいいんじゃないか?




400 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 17:21:40 BE:1614463687-2BP(200)]
www.borland.co.jp/cppbuilder/freecompiler/
が切れていてBorland C++ Compilerがダウンロードできないんだけど


401 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 17:25:43 ]
>>400
普通にアクセスできるしスレ違いですさようなら

402 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 02:25:47 ]
test

403 名前:397 mailto:sage [2008/04/01(火) 02:34:57 ]
>>398
環境依存てことですかね〜。

>>399
vcとのクロス開発あたりだとエラーがでてしまうのです;;

根本的になにをやりたいかというと、
シリアライズ機能を自前で実装しようと考えていまして
実装の際にRTTIのtypeidを利用して組むとらくそうなのですが・・・
ない場合はMFCやwxWidgetのようなクラス毎にマクロを仕組んで
独自の機構を作るしかないのかなって悩んでしまって・・
※boostのシリアライズという選択肢もありますが、boostが対応していない環境も考慮しました。


404 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 06:49:14 ]
というか、例外・RTTI・CRTは、何も考えずに
DLL超えとか、コンパイラ/オプションの違うlibを混ぜるとか
するとハマるよ?

405 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 06:58:03 ]
>>403
libのクラスをもう一度派生させたのを使ってみてはどうかな?
念のために聞くけど、そのlibをコンパイルしたコンパイラと使ってるコンパイラの種類とバージョンはあってる?


406 名前:397 mailto:sage [2008/04/02(水) 04:43:48 ]
>404
こちらはそこを懸念してるんですが、出来上がったものを使うのは私ではないのでなんとも・・・

>405
バージョンのほうはあってますが、こちらでつくったモジュールがどのようなケースで使用されるか
をすべて網羅するわけにはいかないので・・
派生というかstubのようなものをproxyとして使用する感じでしょうか?

なんというか、それなりの状況でも使用に耐えうるもの、となると
結局RTTIははずさなければならないのかな、と思いました。


407 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 05:08:21 ]
これはひどい
builder.japan.zdnet.com/sp/c-programming-language/story/0%2C3800083430%2C20370255%2C00.htm

408 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 06:12:08 ]
アクセスできるすべての識別子をリストアップするようなツールはないでしょうか。
class X {
 int i;
public:
 int j;
 void f() {}
};
というような場合に、
X
X::j
X::f()
みたいに出力できるとうれしいのですが……。自分で字句解析するしかないかな。

409 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 06:47:39 ]
doxygenいろいろ設定すれば出来るんじゃね?知らないけど。



410 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 08:45:55 ]
>>407
他で散々話題になっているんだからここでまで張らなくていいよ。

411 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 00:16:30 ]
>>408
doxygenで可能。privateは出てこない(設定で変えられるかも)

412 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 13:46:16 ]
extern "C"しないで作られたshared libをcから呼ぶ方法ないでしょうか?

413 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 14:19:43 ]
マングリング名がCの識別子として使えるならいけるかもね

414 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 14:49:22 ]
C++ で C 用のラッパ関数作るといい。

415 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 16:47:51 ]
>>412
.defファイルをがんがって作る


416 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 20:14:21 ]
ふつーにdlopenするとか。呼び出し規約が同じとは限らないけどw

417 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 17:03:38 ]
gccxmlを使った他言語(pythonなど)への
インターフェース自動生成ツールが最近でてきてるけど
ちょっと複雑なコードだと自動生成に失敗するみたいだ

まだ発展途上のツールだから仕方ないのか
gccxmlに渡すオプションを考えればうまくいくのか

どうなんでしょうか?

418 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:28:21 ]
Exceptional C++ を読んでて、疑問点が出てきましたので質問します。
P173〜181 にかけての auto_ptr についての説明中に、

T* pt( new T(1) );
auto_ptr<T> pt( new T );
auto_ptr<T> a( source() );

↑どう見ても関数呼び出しに見えるのですが、
初期化子と解釈しないとどうも前後の説明から辻褄が合いません。
ですが、手元にある数冊の参考書を調べてもググってみても
以上のような構文は「コンストラクタ初期化リスト」以外には見あたりませんでした。
これは関数呼び出しなのでしょうか?それとも初期化子なのでしょうか?
もし、初期化子だとしたら、このような構文が出てきたときに
どのようにして見分けたら良いのでしょうか?
また、関数呼び出しのように見える初期化子の使い方についても
よろしくご教示願います。

419 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:34:16 ]
まさか<T>の部分を聞いてるのか?



420 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:43:27 ]
int i = 0;
int i(0);

上のふたつは等価、という話なのかな?

typename identifier(typename, typename, ...); // プロトタイプ宣言
typename identifier(arg1, arg2, ...); // 初期化
identifier(arg1, arg2, ...); // 関数呼び出し

ただし、C++では、関数宣言として解析できるものは関数宣言と見なすので、
list<int> data(istream_iterator<int>(cin), istream_iterator<int>());
は(cinの内容で初期化したlistの宣言ではなく)関数宣言になる。

421 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 21:26:48 ]
typedef typelist< char, 1, 2, 3, bool > LIST;
なんてことは出来ないですかね?

422 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 21:32:31 ]
boost::mpl, boost::tuple, boost::fusion辺り?

423 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 22:43:42 ]
>>418 読むだけじゃなくていろいろ試してみたら?

424 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 23:49:20 ]
classメンバを外部からリードオンリーに出来ませんか?
全部のメンバにゲッタを設定するのも面倒ですし


425 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 23:49:20 ]
>>418
その本持ってるが、その部分に間違いはない。
auto_ptrのメンバ関数のインターフェース見れば疑問は無くなるはず。


426 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:19:52 ]
>>424
面倒でも書く。


427 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:32:34 ]
>>424
class A{
public:
int aho;
};

const A baka; //全部リードオンリーなクラス

428 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:46:55 ]
>>424
必要になるまでゲッタなんて書かなきゃいい。

429 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:59:50 ]
>>424
constは?



430 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 01:07:46 ]
constなんてダサい。時代はreadonly。

431 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 01:08:06 ]
extern "C" {
struct B : public A
{};

}
ができた. class AのデータだけにはCからアクセスできるのかも
methodは無理か?

432 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 01:25:03 ]
extern "C" は変数と関数にしか意味がないからな。

433 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 08:03:03 ]
>>424
class A {
int member_prv;
public:
const int & member;
A() : member(member_prv) {}
}

まあ何だ、C++にはReadOnlyなプロパティを書く構文的な補助がないから、素直にgetter書いとけ。

434 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 12:05:30 ]
漏れはこんなマクロを書いた。

#define readonly(TYPE, ID)\
  public: TYPE ID() const { return _##ID; }\
  private: TYPE _##ID

class C {
  readonly(int, priv);
  readonly(unsigned int, b1) : 16;
  readonly(unsigned int, b2) : 16;
public:
  C() {}
};


435 名前:デフォルトの名無しさん [2008/04/08(火) 17:57:59 ]
キーワードtypenameの意味が分かりません。テンプレートを定義するときに
よく使われるようですが、なくても良いような気がします。例えば、
プログラミング言語C++のp.599にある bind2nd の定義のtypenameを取って
コンパイルしてみましたが、コンパイルが通って、テストコードがきちんと
動きました。typenameの存在意義を教えていただけないでしょうか。
こういう場合にtypenameがなければ困るという分かりやすい例が欲しいです。

// ----- プログラミング言語C++(p.599)より -----
template <class BinOp>
class my_binder2nd : public unary_function<BinOp::first_argument_type, BinOp::result_type> { // my_を付けて実験
protected:
BinOp op;
typename BinOp::second_argument_type arg2; // このtypenameを取ってみた。
public:
my_binder2nd(const BinOp& x, const typename BinOp::second_argument_type& v) // このtypenameも取った。
: op(x), arg2(v) {}
result_type operator()(const argument_type& x) const { return op(x, arg2); }
};

template<class BinOp, class T> my_binder2nd<BinOp> my_bind2nd(const BinOp& op, const T& v)
{
return my_binder2nd<BinOp>(op, v);

436 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 18:30:35 ]
>>435
www.fides.dti.ne.jp/~oka-t/cpplab-template-4.html

437 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 18:33:46 ]
C++FAQにありそうなネタだな

438 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 22:18:03 ]
コンパイラの迷いを断ち切るためにあります


439 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 04:22:44 ]
>>436
なるほど、理解できました。でもコンパイラが十分賢ければtypenameは不要だと
言えそうですね。コンパイラはテンプレートの解析時においては typename
を付けていない T::something が型かどうか分かりませんが、実際にコードを
生成するときには分かるので、本質的には曖昧さの問題はないように思えます。



440 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 08:02:13 ]
移植性を考慮するなら付けておけばいい。

441 名前:デフォルトの名無しさん [2008/04/09(水) 15:23:39 ]
別のファイルで定義した変数を使うにはどうしたらいいんでしょう?
プログラムの改変を行っているのですが、前任者が作業ごとにファイルをわけています。
AAA.cppみたいなのがいっぱいあります。ヘッダファイルも同じ名前でたくさんあります。

442 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 16:03:35 ]
ググって一番上に来たサイト。
7ujm.net/C++/extern.html

内容は見てない。

443 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 18:11:09 ]
VC++ってもうやばくないですか?
今やVBC#でもms単位で計測しないと実行速度違いがわからないぐらいですし
出来ないこともないですよね

444 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 18:34:02 ]
>>443
場合によりけり
あと、その話題はこのスレ向きじゃない

445 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 18:54:39 ]
>>443
んな事ないよ
OpenGL Viewerが前回のバージョンから恐らくC#になったんだと
思うが、やはり動作がもさもさする。

446 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:32:09 ]
>>443
ゲームとかms単位が命取り
ms以下単位だったら考えてやる

447 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:34:04 ]
μに縮まったとしてもまだでかいだろ。

448 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:42:54 ]
数値計算とかやったことないんだろうなあ。

449 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:48:47 ]
>>441
そういうファイル構成はC++では一般的。
その同名のヘッダーを読み込みば、十分アクセスできるはず。その前任者のソースをよく読んでC++を勉強すること。
C++はexternを滅多に使わないからね。






450 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:55:45 ]
XBOX360のゲームは全部C#で書かれてるだろ

451 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:57:04 ]
>>443
全然やばくない。世界はもっと広い。

452 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 20:26:56 ]
>>439
T::something が型でも値でもコンパイルできてしまう場合は困るでしょう?
多分どちらかは間違っているんだから

453 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 21:06:55 ]
>>450
んなわけないだろ

プロがXNAで開発してるとでも思ってるのか?

454 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 21:56:02 ]
思ったw

455 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 22:26:41 ]
.netフレームワークを要求する商用アプリで動きが機敏なアプリをいまだかつて見たことないな。

456 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 23:32:25 ]
多言語からc++を呼ぶインターフェイスで
std::cout
がおかしくなる原因になってるらしくなんとかしたい
#define __streambuf なにか
にできればいいのだけど voidに置き換えるとコンパイルとおらない
何か適当なクラスでもないでしょうか?



457 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 23:38:17 ]
ios::sync_with_stdio で解決されるような問題じゃなくて?

458 名前:456 mailto:sage [2008/04/10(木) 00:12:16 ]
他言語の処理系がstdcoutをすでにリンクしているのに
さらにその処理系から呼び出すcのプログラム中でもリンクしてるのが
問題なってる可能性があるような気がしています

なので
#define __streambuf Hoge
できると多分うまくいくのではないかと

459 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:17:47 ]
XNAなめんな



460 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:22:13 ]
>>456
多言語から呼び出すってっ、もしかすると他言語からDLL呼び出しすることってことかな?
だったらライブラリの初期化がうまく言ってないんじゃないか?dllmainはこねこねした?


461 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:23:42 ]
あと、DLLはマルチスレッドライブラリでコンパイルだよ。

462 名前:456 mailto:sage [2008/04/10(木) 00:24:19 ]
>>460
正確にはlibhoge.soを呼んでます
libhoge.soがstd::stream関係をリンクしてます

463 名前:460 mailto:sage [2008/04/10(木) 00:27:49 ]
linuxでしたか。>>460はwinの場合の注意事項でした。

464 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 07:50:43 ]
>>461
MTでコンパイルしないといけない決まりでもあるの?

465 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 08:21:08 ]
>>464
ある。
DLLをコンパイルするときはMTでする必要がある。プロジェクトの作成でDLLを選択すると自動的にマルチスレッドランタイムライブラリが選択される。
呼ぶ側はどっちでもいい。

466 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 11:49:02 ]
>>465
何の処理系の話か知らないがVisualC++なら
シングルスレッドのランタイムの静的ライブラリをリンクしたシングルスレッド専用のDLLを普通に作れる

467 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 11:57:21 ]
端で見てて想像した通りの食い違い方w

468 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 12:10:14 ]
初歩的な質問で申し訳ないんだが、他言語から C++ の
ライブラリを使って問題無いはず、という保証はあるんだろうか?

あと、普通に C++ で呼び出すとかなぜしないのだろうか。
(これは状況がわからんとなんとも言えないけど)

469 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 14:18:03 ]
operator==() の定義はクラスの中とクラスの外に置けますがどのように
使い分けるのでしょうか?

std::type_info はクラスの中でその他はクラスの外が多いのですが。




470 名前:デフォルトの名無しさん [2008/04/10(木) 15:34:04 ]
別にoperator==()に限らずメンバ関数は中にも外にも置けるけど。

471 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:04:36 ]
ププ

472 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:05:09 ]
ペペ

473 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:30:44 ]
== どうするかは状況によるんでは。無理無く member にしないで
いいならそうすればいいような気がするが。中身の情報が必要な
場合に member にしてるんじゃないの?普通に生じる状況だと思うけど。

474 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:43:05 ]
メンバに出来るものは中に書く。
メンバに出来ないものは外に書く。
以上。

475 名前:デフォルトの名無しさん [2008/04/10(木) 18:05:52 ]
c++のエラー出力の文字コードがutf-8になっているのですが、
euc-jpにする方法ありますか?
Linuxのeuc-jp環境でプログラミング行っており、
gcc version 4.1.2 です。

476 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 18:18:07 ]
iconv

477 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 18:40:50 ]
ロケール切り替えろとしか

478 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 19:06:32 ]
public 関数だけで実装できる場合は非メンバーにする。
friend を使って非メンバーにすることもある。


479 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 20:50:36 ]
式の対称性が必要なら非メンバー



480 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 20:59:53 ]
自身への参照を返すことが期待されるか、自身を変更する場合は、メンバーにすることが漏れは多いな。
operator=, +=等はメンバに。operator==, <<, +等は非メンバ(場合によってはfriend)にしてる。


481 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 21:08:54 ]
op == あたりの話はeffective C++に書いてなかった?
もう忘れちゃったけど。
グローバルにop ==を置くことでカプセル化が上がるとか
その話とはまた別?

482 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 21:20:10 ]
friend はできれば避けた方が良いというの無かったっけ?

483 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 22:12:02 ]
C++ Coding Standards の 44 には
「できるだけ非メンバーかつ非 friend の関数を書くようにしよう」
というのがありました。

484 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 22:19:02 ]
C++の本質はやっぱプリプロセッサとテンプレートだろ・・・
オブジェクト指向なんてうんこ


485 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 23:00:41 ]
プリプロセッサはちょっと違うだろ・・・
現実的にメタプログラミングするのには必要だけど。
個人的にはデストラクタを推すね。

2行目は同意。

486 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 23:08:04 ]
デストラクタとはいいところをつくね。
RAII 万歳!

487 名前:デフォルトの名無しさん [2008/04/10(木) 23:25:35 ]
friendかな


488 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 23:58:56 ]
>>485 == >>486 ??

489 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:01:31 ]
デストラクタの価値が分からないうちは
プログラマの資格なしだぜ



490 名前:485 mailto:sage [2008/04/11(金) 00:03:01 ]
>>488
ID出ない板だからどうしようも無いけど、
違うとだけ。

491 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:14:49 ]
デストラクタはクリティカルセクション解除するのに使ってる。
メモリリークどころの騒ぎじゃない

492 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:17:31 ]
Javaとかどーやってんだ?
デストラクタ

493 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:20:23 ]
Javaはcloseとかdisposeとかメソッド作って
呼び出さないといけないんじゃなかったっけ?

494 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:25:56 ]
Javaはデストラクタ勝手に作ってくれるから。
DB接続とかファイルハンドルにクリティカルセクションだの
なんでも閉じてくれる。


495 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:28:48 ]
前スレから
pc11.2ch.net/test/read.cgi/tech/1200044614/496-

496 :デフォルトの名無しさん [sage] :2008/02/15(金) 14:44:30
  つまるところc++ではデストラクタに頼るべき。

497 :デフォルトの名無しさん [sage] :2008/02/15(金) 14:54:04
  C++はつまるところデストラクタのことだからな
  closeさせといてガベージコレクタがあるとか抜かす言語は笑えるな
  intは回収できるが巨大なファイルリソースはリークするわけだ

498 :デフォルトの名無しさん [sage] :2008/02/15(金) 15:06:22
  日本語でおk

499 :デフォルトの名無しさん [sage] :2008/02/15(金) 15:08:34
  >closeさせといてガベージコレクタがあるとか
  禿げあがる程同意。
  
  C#はusing(o1,o2,...){}があるから多少マシだけど、
  forみたいにusing用のスコープ作るから
  スコープ違いが混じるとネストして見辛くなる。
  どう考えてもc++みたいに対象の変数のスコープでDisposeした方が良いと思う。
  
  javaのtry-finally-closeに至っては論外。
  しかもcloseで例外出たらfinally内で潰さないと
  try内で発生したより重要な例外が消されるし・・・。

500 :デフォルトの名無しさん [sage] :2008/02/15(金) 16:33:04
  >どう考えてもc++みたいに対象の変数のスコープでDisposeした方が良いと思う。
  そして言語はC++/CLIへと進化するのであった、まる

496 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:34:08 ]
Javaをはじめ、メジャーな言語のGCはメモリ不足しか認識しないから、
明示的にcloseしない場合、メモリに余裕があればfinalizeは呼ばれず、
DB接続も閉じられない

そしてコネクションプールのタイムアウトで死に始める業務アプリ
鳴り始めるサポートデスクの電話機達

497 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:39:21 ]
まぁJavaなんてマーケット戦略で広まっただけのうんこ言語だからな・・・
プログラマと名乗るくらいならC++くらいできる頭を持って欲しい・・

498 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:59:54 ]
finalize()でリソース解放なんて保険でしかないからな

499 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:00:32 ]
リソース管理で似た話を読んだことある気がしてたけど思い出せた
ttp://mag.autumn.org/Content.modf?id=20050506023118



500 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:00:40 ]
でもね、C++は巨大で複雑怪奇だからね。Cを引きずってる面もあるし。
無駄を削ぎ落として細部を明確にした言語が望まれるというのもわかるよ。
それとGCの有用性とは別の話だが。

501 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:03:52 ]
実はVBなんかも
リソース周りは優秀だったりする

502 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:26:11 ]
continuationを明示的に扱えない言語はうんこ

503 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:26:35 ]
scheme習いたてですか?

504 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:55:30 ]
>>503
C++習いたてです。

505 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 07:46:34 ]
C#のusingの使いづらさは異常
scopedとでもして識別子が入ってるブロックの最後でdisposeしてくれたほうがよかった

506 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 08:50:00 ]
素朴な疑問です。

#include <iostream>
struct S { virtual void hoge() = 0; // 純粋仮想のみ };
struct S1 : public S { void hoge() { std::cout << "S1" << std::endl; }};
struct S2 : public S { void hoge() { std::cout << "S2" << std::endl; }};
int main()
{
 S1 s1;
 S2 s2;
 S& r1 = s1;
 S& r2 = s2;
 r1.hoge();
 r2.hoge();
 r1 = r2; // 基本クラスの参照を代入
 r1.hoge();
 r2.hoge();
 return 0;
}

VC8で上記のコードを実行すると
S1
S2
S1
S2
と表示されました。
r1 = r2;はS::operator=を呼ぶだけなので何も変わらない、と理解したのですが、
これはC++的に正しい挙動なのでしょうか?
それとも未定義でたまたまこうなっているだけなのでしょうか?

507 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 08:55:40 ]
あ、改行を削ったらコメントをミスりました。
> struct S { virtual void hoge() = 0; // 純粋仮想のみ };

> struct S { virtual void hoge() = 0; /* 純粋仮想のみ */ };
です。

508 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 08:56:43 ]
単純に、自動生成されたoperator=(S, S)で仮想関数テーブルが書き換わらないようになってるだけ。

509 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 08:57:18 ]
s1, s2のうちSの部分だけがコピーされた、と解釈すればわからんでもない



510 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 09:00:15 ]
とりあえず解決するには自分でS2 operator=(S, S)を定義すればいいように思えるが、
それはS = Sの一般的な代入に関して考えるとかなり狂っているから諦めろって言う話でっていう

511 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 12:27:47 ]
>>498
同意。finalizeって呼ばれるとは限らないとか。ほんとに気休め程度だね。


512 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:29:20 ]
>>506
代入や他オブジェクトでの初期化でvptrは変更されない。


513 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 15:56:17 ]
class A { friend class B; int x; };
class B { class C {}; };

VC8.0 では class C から class A の x が参照できますがこれは C++ の仕様ですか?


514 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 19:00:01 ]
Cのreadableなプログラムを自動生成するメタ言語みたいなの
ないでしょうか?
readableじゃないのならあるのですが、読めないと意味ないのです

515 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 16:01:17 ]
具体例を。

516 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 16:08:22 ]
まともなCソースも >>514 には、readable じゃなさそうだ...。

517 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:17:27 ]
vector<int>で何個か反復子を進めたあと、
それが今何番目の要素なのかを知る関数はないですか?

518 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:20:51 ]
>>517
std::distance

519 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:21:19 ]
i - v.begin();



520 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:55:08 ]
できました、ありがとうございます。

521 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:34:09 ]
mag.autumn.org/Content.modf?id=20050506145337
ここ読むとC++よりもJAVAのほうがリソース管理に関して
優れているように思えるんだけど

522 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:42:17 ]
だから何だよ

523 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:46:30 ]
優れているというかパフォーマンスを犠牲にしてリソース管理の安全性を高めたという方が近いかな。
そんな事いったらC++も保守性を犠牲にパフォーマンスを高める余地のある言語と言えるけど。
ただJavaの場合は“余地”どころかプログラマに選択をさせない完全な“切捨て”であるけどね。
だからプログラマが手段を選択できる余地の残っているC++の方が優れている。終了。

524 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:49:22 ]
手段を選択する必要のある場面においては、だけどな。

525 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 02:15:33 ]
javaってfinallyの書き方間違えると死ねるしなあ
という話が >>495 にあるよ

jdbcでoracle使ったことがある人は知ってると思うけど、
closeし損ねるとリークしてそのうち動かなくなるんだよね

これを注意深く追ってると、「なんだかCでやってんのと変わらんなあ」
と思うぜ、実際。

526 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 02:27:32 ]
だってメモリしか管理してくれないもの


527 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 07:08:37 ]
>521
「RAIIが発明されるまでのC++」については、Javaのほうが
リソース管理が優れていた、と云わざるを得ない、けどねぇ。

528 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 07:25:04 ]
他のリソースも管理してくれればいいのになあ。
ファイルハンドルが足りない時には
ファイルクラスのインスタンスへのガベコレを
優先的にやってくれるとか。

529 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 10:47:50 ]
>>527
> 「RAIIが発明されるまでのC++」

って具体的に何を指すの? RAII ってプログラミング
ポリシーだと思うんだけど。「発明」されたっていまいちピンと来ない。





530 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 11:04:02 ]
RAII が浸透してない C++ って感じのことを言いたいんじゃないか?
未だに RAII を取り入れない C++ があるとは信じられないのかもしれないが。

531 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 12:21:55 ]
>>528
デストラクタを活用するべき

532 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 12:25:18 ]
javaの話だろ

533 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 12:50:09 ]
>>527
C with class の話ですか?
C++は初期のARMがかかれた頃から散々言われていますけど。

534 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 18:05:47 ]
>>529
強いて言えば、テンプレートがなかった頃には、
auto_ptrや(削除子付きの)boost::shared_ptrのような
汎用的なものは作りづらかったと思う。

それでも、fstreamみたいに個別に作っていく手があったはずだけど。

535 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:38:58 ]
なんでそこで糞設計のstreamを持ち出すかなー

536 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:33:50 ]
とりあえずデストラクタでcloseしてくれるからいいだろ。
今は糞設計かどうかなんて関係ない。

537 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 23:13:37 ]
自分のクラスにiteratorをアタッチ
するにはどうすればよいの?

538 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 00:45:20 ]
>>537
クラスって新しい container 作ってんの?
普通に vector とかにオブジェクト入れて iterator 使うとかいう話
じゃないんだよね?

539 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 02:36:34 ]
>>537 アタッチの意味がわからん。



540 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 07:56:33 ]
Rubyみたいにアタッチしたいんだけど
なんでできないの?

541 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 08:59:06 ]
だからアタッチって何だよ

542 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 09:20:53 ]
ウラララララーって叫ぶやつじゃね?

543 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 16:55:57 ]
それは、アパッチ

544 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 16:56:46 ]
>>543
叫ぶやつはジェロニモだ

545 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 17:24:27 ]
だってオラは人間だから

546 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 21:52:48 ]
テンプレートクラスとクラステンプレートの違いを教えてエロい人!!

547 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 21:58:18 ]
クラステンプレートを使って作られたクラスがテンプレートクラス

548 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:09:23 ]
何か詳しく書かれたサイトがあれば貼っていただきたいです。

549 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:14:51 ]
お前誰だよ



550 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:20:43 ]
つーか言葉にこだわってどーすんの
テンプレート勉強すりゃわかることだろうに

551 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:32:59 ]
ヒントがあれば十分だろ。
自分で考えて解決する楽しさを知らないやつは(ry

552 名前:551 mailto:sage [2008/04/15(火) 22:33:53 ]
>>551
誤爆しました。ごめんなさい、


553 名前:デフォルトの名無しさん [2008/04/15(火) 22:36:31 ]
輪講で必要なんです。
わかりにくかったので聞いてみました。

554 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:43:22 ]
>>552
流れとしてはわりと的を射ている気がするw

555 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:01:58 ]
テンプレートクラスはただの間違いだと思う
クラステンプレートが正しい。だってあれはテンプレートだから

クラステンプレートをテンプレートクラスというのは
鉄パイプをパイプ鉄というようなもの

556 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:16:18 ]
>>555さん
わかりやすい表現ありがとうございます。

教科書には
クラステンプレートはテンプレートクラスから導出できる。
クラステンプレートは非テンプレートクラスから導出できる。
テンプレートクラスはクラステンプレートから導出できる。
非テンプレートクラスはクラステンプレートから導出できる。
と書いてあるのですが・・・

557 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:24:08 ]
まずは本の名前を晒してみれ。

558 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:25:34 ]
なんの哲学書だよw

559 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:26:56 ]
こんにゃくゼリーに使うこんにゃくをゼリーこんにゃくって呼んでる類だろ。



560 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:26:59 ]
ぐぐってでてきた。これは比較的納得できるかんじ
www.ed.kuki.tus.ac.jp/cgi-bin/vahwebx.exe/Ja_JP/cforaix/Extract/0/glossary/czgt.htm
クラス・テンプレート(class template)
暗黙的にまたは明示的にインスタンスを生成されるか、または特殊化されると、クラス型を作成するテンプレート。

テンプレート・クラス(template class)
クラス・テンプレート(class template)によって生成されるクラス・インスタンス。

561 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 00:01:31 ]
ソースで出てくる順がtemplate classだから間違えやすいな

562 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 00:03:46 ]
typename

563 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 00:49:24 ]
STLに
boost::any相当のものってないよね?

困った困った

564 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 01:41:23 ]
普通にboost::any使ったら?

565 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 01:51:09 ]
vectorにデータを追加した時にメモリ確保に失敗した場合、検出する方法ってありませんか?
newでいうbad_allocの例外をキャッチするような感じ。

566 名前:565 mailto:sage [2008/04/16(水) 02:26:50 ]
解決しました。orz
bad_alloc使えた...

567 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 03:21:12 ]
>>563
無いなら作れば?
大したもんでもないっしょ。

568 名前:デフォルトの名無しさん [2008/04/16(水) 13:24:51 ]
あるアクションゲームをCとC++両方で作りました。
プレイする上で、まったく同じ動作をするものです。

Cでは主に構造体で、C++ではVectorで管理していました。
C++で作ったほうがプログラム実行時のメモリ消費量が多いのですが、
そんなもんでしょうか?

569 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 13:41:18 ]
そんなもん
完全に同一ソースでもバイナリレベルでは例外処理が入ったり、実行時型判定が入ったりする



570 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 13:42:03 ]
>>568
Vector は std::vector のこと?
そうなると構造体と std::vector とでは役割が違うので、置き換えれるわけ無いんだけど。

・・・もしかして
struct S { int a, b, c } s;
s.a = s.b + s.c;
これを
std::vector<int> s(3);
s[0] = s[1] + s[2];
にしたってこと?

まぁプログラムが違うんならメモリ消費量が違うのはあたりまえなんで、
あんまり気にしてもしょうがないと思う。同じになるはずっていう根拠でもなければ。

571 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 13:49:57 ]
配列のことを構造体といい間違えたのではないか。

572 名前:568 mailto:sage [2008/04/16(水) 14:33:50 ]
配列ですね、すみません。
消費メモリが数十MByte単位で変わってくると、さすがに気になったので質問しました。
C++の設計に改善点がまだあるような気もします。


573 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 16:51:23 ]
数十MBって、それってC/C++以前にプログラムの構造がおかしいだろ常考

574 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 17:15:02 ]
> C++で作ったほうがプログラム実行時のメモリ消費量が多いのですが、
これだけ読んだら、普通はもうちょっとささやかな差を想像するよね。
その想像をベースにして皆が一般的なことを回答したところで、いきなり
> 消費メモリが数十MByte単位で変わってくると、
っていう、量に関する新情報を出すっていうのは、広義の「情報小出し質問」だと思うよ。

自分だけが知っている状況を他人に説明するときは、発信する前に
「相手はこの説明に触れて、真っ先にどんなものを想像するだろうか?」
っていう思考を巡らせるべき。

で回答だけど、「構造体とvector」以外に両者のソースがどう違ってるかがわからないと、何とも言えない。
質問文に登場した要素だけで考えるなら、STLの使い方をどこかで根本的に間違えているんじゃないか
って気がするけども。

575 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 18:22:21 ]
前方反復子のクラスはデフォルトコンストラクタが必要ですけど、
デフォルトコンストラクタで生成した反復子やそれを代入した
反復子に対する操作の結果は定義されているでしょうか?


576 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:42:11 ]
ttp://www.asahi-net.or.jp/~yf8k-kbys/newcpp18.html
このサイトを見ながらC++の基礎を勉強しているのですが、このページのデストラクタのサンプルプログラムを
VC++2008EEに打ち込んでも「消滅しました」のメッセージが出ないのですが、
これはVC++側の処理の問題でしょうか?

577 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:44:49 ]
詳しく読んでないからわからんが、派生クラスで基底クラスのデストラクタが呼び出されないとかなら
virtualが抜けてるからとかそんなんじゃね?

578 名前:デフォルトの名無しさん [2008/04/16(水) 20:51:17 ]
まだ始めたばかりの初心者です。。
あまりを出さなくてよい、簡単な割り勘のようなのを作っているのですが、
-
#include<stdio.h>

int main(void)
{
int a,b,c;

/*計算の入力 金額*/
printf("金額を入力してください");
scanf("d%",&a);
/*人数*/
printf("人数を入力してください");
scanf("%d",&b);

/*計算と結果の表示*/
c=a/b;
printf("%d/%d=\t%d\n",a,b,c);

return 0;
}
-
これを実行させると、金額を入力してEnterキーを押した時点で変な数字が出てきてしまいます…
なにか足りない気がしますが、何処がおかしいのでしょうか…?
ご教授よろしくお願いします。

579 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:51:27 ]
どのコードを書いて、どういうメッセージは出たのか、
情報が足りなさ過ぎる。



580 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:52:05 ]
>>579>>576

581 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:53:09 ]
>>578
d%

582 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:53:29 ]
scanf("d%",&a);
打ち間違い?

583 名前:576 mailto:sage [2008/04/16(水) 21:15:39 ]
>>580
スミマセン。。。
//dest_sample.cppのコードをまるっきりそのまま書いて実行したところ、
実行結果例の下2行の「消滅しました」のつく文だけ表示されません。
問題なくコンパイルできますし、上4行の「生成されました」と「呼び出されました」
の付く文は正常に表示されます。
試しに、筆者が書いたものをコピー&ペーストして実行してみましたが、
やはり「消滅しました」のつく、下2行の文が表示されません。
~Nanika(){
cout << "Nanikaのインスタンス" << datum << "が消滅しました。" << endl;
が完全に無視されているような状態です。

宜しくお願いします。

584 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:29:48 ]
コンパイラは何?

585 名前:デフォルトの名無しさん [2008/04/16(水) 21:39:59 ]
namespaceにはまっています。
あるソースファイルのnamespaceで囲まれた関数を別のソースファイルでexternしたいのですが、
どうすればいいかわかりません。コンパイルエラーになります。
名前空間名を付けて呼び出してもだめで・・・。
aaa.cpp-----------------------------------
#include <stdio.h>

namespace hoge
{
void Func()
{
printf("HELLO\n");
return 0;
}
}
bbb.cpp------------------------------------

extern void hoge::Func(); ←コンパイルエラー

void main()
{
hoge::Func() ← コンパイルエラー
Func(); ← コンパイルエラー

return;
}
-----------------------------------------
bbb.cppからaaa.cppの名前空間が見えてないっぽいんですがこんな場合どうしたらいいのかわかりません。
ネットでも検索したのですが、複数ファイルに分ける事ができる記述はあっても
やり方が乗ってないので困ってます。どなたかお願いします。


586 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:41:05 ]
namespace hoge{ extereeeen void Func(); }

587 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:41:27 ]
namespace hoge {
 void Func();
}

int main()
{
 hoge::Func();
}

588 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:45:14 ]
ああ、コンパイラはVC++2008EEか。

589 名前:デフォルトの名無しさん [2008/04/16(水) 22:00:46 ]
>>586
bbb.cppでexternする場合はコレもnamespaceで囲んであげないといけないと言うことでしょうか!?
やってみたのですがVC++6.0なせいか hogeがシンタックスエラーを起こしてます。
VC++対応していない?明日会社でやってみます。

>>587
586さんと似てるのですが、externしなくてもよいと言うことでしょうか?
これまたVC++6.0ではhogeがシンタックエラーを起こしています。
明日やってみます。



590 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 22:56:43 ]
VC6 でも問題はないはずなんだが・・・

591 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 22:57:30 ]
関数プロトタイプはデフォルトで extern ってのは常識だろ?

592 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 22:59:45 ]
>>583
VC++2008でやってみたけど、ちゃんと表示されたよ。

593 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 23:09:05 ]
ひょっとしてNanikaのインスタンスを
グローバルで生成したというオチではないだろうなw

594 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 23:12:02 ]
外部ライブラリのデストラクタの方が後に走るから
グローバル変数にしても cout に問題はないと思う。
というか、グローバルにしても表示された。

595 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 01:48:09 ]
#include <boost/regex.hpp>

template<typename TChar>
class TCHoge
{
public:
  typedef boost::basic_regex<TChar>  regex_type;
  static int Func(regex_type reg){ return 0; }//ok
  //static int Func(regex_type::flag_type flag){ return 0; }           // NG1
  //static int Func(boost::basic_regex<TChar>::flag_type flag){ return 0; } // NG2
  static int Func2(boost::basic_regex<char>::flag_type flag){ return 0; }   //OK
};

Window2000
Visual C++ 2005 express edition
boost 1.34.1

 NG1 のように記述したいのですが,以下のようなエラーとなってしまいます.

warning C4346: 'boost::basic_regex<charT>::flag_type' : 依存名は型ではありません。
error C2061: 構文エラー : 識別子 'flag_type'

VC6.0 では問題なかったのですが,どのように記述すれば良いでしょうか?

596 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 02:07:22 ]
×boost::basic_regex<TChar>::flag_type
○typename boost::basic_regex<TChar>::flag_type

だっけ?あまり自信ないや

597 名前:595 mailto:sage [2008/04/17(木) 03:25:08 ]
>>596 さん,有難う御座います.教えていただいた方法でうまくいきました.

これから typename をつけまくる作業に戻ります…

それでは.

598 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 03:48:20 ]
>>575
基本的には全部未定義。唯一、デフォルトコンストラクタで初期化したイテレータに、
そうではない値を代入することができる、ってことになるみたい。
24.1p5 の "Iterators can also have singular values ..." あたりにそんなことが
書いてあって、デフォルトコンストラクタで作った Forward iterator は singular value を
持つ(ことがある)とされている。

要するに未初期化のポインタやヌルポインタと同じ扱いってことね。

599 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 07:27:26 ]
>>597
VC6 だと逆にエラーになるから
もし VC6 でもコンパイルしたいということになりそうなら
後で切り替えられるようにマクロにしといた方がいい。



600 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 08:28:19 ]
VC6を窓から捨てるのが正解かと
boostでもVC6は切ってるし

601 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 10:52:55 ]
>>589
プロトタイプ宣言したヘッダファイルを作れ。
つーか、チミのやりかたではnamespaceつくらなくてもアウチなんだけど

602 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:52:38 ]
stlやboostを使っていると、typedefを書く場所に悩みます。
class ClassA { HogePtr pHoge_; };
class ClassB { HogePtr pHoge_; };
この時、typedef boost::shared_ptr<Hoge> HogePtr;はどこに書くのが理にかなっているのでしょうか?
Hoge.h?それともClassA.hとClassB.h?

603 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:56:08 ]
>>602
typedef しないという選択肢は無いのかね?
ほんとに HogePtr に意味があるなら Hoge.h だろうね。

604 名前:602 mailto:sage [2008/04/17(木) 13:00:36 ]
>>603
すみませんtypedefしない選択肢もありました。
Hoge.hでtypedefするか、typedefしないかの2択ですね。
ありがとうございました。

605 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 21:40:19 ]
class Hoge {
public:
typedef boost::shared_ptr<Hoge> ptr_t;
};
というのはどうですか?

606 名前:デフォルトの名無しさん [2008/04/17(木) 23:27:03 ]
ClassA や ClassB の実装部分を HogePtr の実体から分離するために
typedef 名をつかうってんなら、いっそ
template class <T> class ClassAImpl { typedef boost::shared_ptr<T> Ptr; ... };
で、
typedef ClassAImpl<Hoge> ClassA;
あたりまでやっちゃうのも悪くないと思うよ。

607 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:14:56 ]
inline std::string Reverse( const std::string & src ){
return std::string( src.rbegin( ), std::rend( ) );
}
これくらいシンプルな感じで実装する方法ないですか?

608 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:21:01 ]
ごめん誰か>>607を翻訳して

609 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:29:32 ]
ようするに逆順でイテレーションしたいんだろうさ



610 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:32:28 ]
実装する手間を惜しんでシンプルな設計を考えることは良いことだが、
人に説明する手間を惜しむのは(・A・)イクナイ!!

611 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:40:34 ]
>>608
すいません。>>609ってことです。しかもstd::rend( )って何だよ・・・orz

当然できんだろ、って思ってたらコンパイルエラーになるんすね。
やっぱcopy使うのが一番まともでしょうか?


612 名前:602 mailto:sage [2008/04/18(金) 01:45:35 ]
>>605
なるほど、それもありましたか。

>>606
ClassAとHogeの分離は考えてなかったです。
考えていたのは、
1、クラステンプレート実体化のコードが長くなるので、stlやboostはtypedefして使うものだと思っていた。
2、shared_ptrを使うという事は、2つ以上のクラス(スコープ)で型を使う事になるので、typedefを1箇所(Hoge.h)にだけ書いて、参照したほうがいいのではないか?
3、しかし、shared_ptrに入れて使うかどうかは、Hoge.hをインクルードして使う側の選択肢であって、使う側の可能性をHoge.hに書いてしまうのはどうか?
といったことで悩んでいました。

613 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 02:14:07 ]
>>611
よくわからんが std::reverse でも使っとけ

614 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 02:24:36 ]
世の中にはある程度の割り切りが必要な時だってあるのさ・・・

615 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 11:03:18 ]
>>611
make_reverse_range(src) // boost::range_ex
src|reversed // pstade::oven

非標準のライブラリ使ってもいいならこんな感じで簡単に書ける

>>612
HogePtrをtemplateにして
template template parameterでboost::shared_ptr等を与える

// hoge.h
struct Hoge { ... };
template< template<typename T> class Pointer >
struct HogePtr {
 typedef Pointer<Hoge> type;
};

// client code
#include "hoge.h"
template< typename T > struct raw_pointer { typedef T *type; };
HogePtr<raw_ptr> raw;

#include <boost/shared_ptr.hpp>
HogePtr<boost::shared_ptr> shared;

これならhoge.hppで#includeしなくてもよくなる筈

616 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 13:57:34 ]
>>615
×HogePtr<raw_ptr> raw;
○HogePtr<raw_ptr>::type::type raw;
×HogePtr<boost::shared_ptr> shared;
○HogePtr<boost::shared_ptr>::type shared;
ではなくて?

そもそもhoge.hppでshared_ptr.hppの#includeを避けるなら
// client code
Hoge* raw;
boost::shared_ptr<Hoge> shared;
でいいじゃん?

617 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 22:57:32 ]
>>581
>>582
返信遅くなってしまいました…
そんな単純なミスだったんですね…
ありがとうございました。

618 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 15:15:17 ]
ベースメンバ初期化で"this"を使用すると警告がでますが、
コンストラクタ内で"this"を使っても警告も何も出ないけど大丈夫なんですか?

警告が出てるのはインスタンスが生成されていることが保証されて無い状態で
そのポインタを読んでいることが原因になっていると考えているのですが、
だとすると、コンストラクタ内で使っても同じことですよね。

警告が出ないのは、そのポインタの先を使用しなければおkって事なんですかね・・。

619 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 15:20:45 ]
コンストラクタ内ではメンバの実体は既に生成されているから問題ない
どんな値がはいってるかは知らないけどね



620 名前:618 mailto:sage [2008/04/19(土) 15:58:08 ]
>>619
>>コンストラクタ内ではメンバの実体は既に生成されているから問題ない
なのに
>>どんな値がはいってるかは知らないけどね
とは?

実体は生成されているけど、thisが指しているのはどこか分からないよ
ってことですか?
それとも、実体の中身に何が入っているか分からないよってことですか?


621 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 16:00:42 ]
ポインタの先を使用しなけりゃ大丈夫。

622 名前:618 mailto:sage [2008/04/19(土) 16:12:46 ]
>>621
ってことは、コンストラクタでメンバ関数のアドレスを引き渡すのも危ないってことですよね。

623 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 16:14:00 ]
コンストラクタ内でそのメンバ関数のアドレスを使わなければ大丈夫。

624 名前:618 mailto:sage [2008/04/19(土) 16:18:31 ]
>>623
なるほど。理解しました。
どうもありがとうございました。

625 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 16:18:41 ]
実体は生成される途中にある。
だから、this は存在する。
存在するが、その実体は完全に生成されていないので、
その実体を操作しようとすると色々な不具合が生じる。

1. メンバ変数が全て生成されている保証は無い。
  → メンバ変数に触る関数を呼ぶとヤバい。

2. 仮想関数の呼び出しが正常に働かない。
  → class B : public A { B() : c(this) { } void hoge(); C c; };
    とした時、B のコンストラクタ内から仮想関数 hoge を呼ぶと
    どんな状況であろうが B::hoge が呼ばれるが、
    C のコンストラクタ内から渡されたポインタを使って仮想関数 hoge を呼ぼうとすると
    どんな状況であろうが A::hoge が呼ばれる。
    B の基本的な初期化が済んでないので、B::hoge を呼ぶ事は非常に危険ということでそうなるのだが、
    もちろん A::hoge が呼ばれてしまう事も危険っちゃ危険だ。

626 名前:618 mailto:sage [2008/04/19(土) 16:37:18 ]
ん...また混乱..

>>1. メンバ変数が全て生成されている保証は無い。
>>  → メンバ変数に触る関数を呼ぶとヤバい。
これだと、例えば,
class AAA {
public:
  // 危険?
  AAA(){
    this->value = 5;
  };
 
  // こちらにしなくてはならない?
  AAA():value( 5 ){
  };
 
  void test(){
    cout<<value<<endl;
  };
private:
  int value;
}
ということ?

627 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 16:55:31 ]
ここで言っているのは、コンストラクタ以外のメンバ関数のことでしょ。
普通、メンバ関数は、コンストラクタによって適切に初期化済みであることを
前提にして書かれているから、
コンストラクタの途中で呼び出すのは、一般的には危険ということ。

628 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 17:18:51 ]
GCC でやってみたら C::C 内でも B::hoge が呼ばれた。未定義なのかな?
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6276.txt

629 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:02:59 ]
vptrは初期化リストに先立って初期化されてるはずだから、
実装的には値が不定なだけだと思うけど、
未定義ではあると思うよ。



630 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:04:28 ]
補足。this->nとかの値が不定って意味ね。

631 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:08:30 ]
前に VC6 でやった時は仮想関数テーブルの初期化は最後だったけど、
どっちの仮想関数が呼ばれるかって仕様で決まってんのか?

632 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:15:06 ]
え〜うそ〜!?
基底のコンストラクタから、
派生の仮想関数が呼ばれない、とかの話と勘違いしてない?

633 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:17:17 ]
基底に this は流石に渡さんぜよ。

634 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:32:06 ]
>>631
VC++だと__declspec(novtable)を付けたクラスでは
vtblの初期化が行われないなんて独自拡張がある。
(最派生クラスだけnovtable無しにして使う)

これ使っていないか?

635 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 19:41:56 ]
novtableいいよねー
コード縮むし

636 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 20:55:37 ]
    |┃三             
    |┃              
    |┃ ≡    _、_   
____.|ミ\___( <_,` )  
    |┃=___     \   
    |┃ ≡   )ATL 人 \ ガラッ

637 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 21:20:55 ]
class Derived : Base {...}

void f(){
  Derived v;
}

this->vptr = &Base::vtbl → Base::メンバ初期化 → Base::ctor
→ this->vptr = &Derived::vtbl → Derived::メンバ初期化(定義順にctor) → Derived::ctor

Derived::dtor → Derived::メンバ破棄(定義逆順にdtor) → this->vptr = &Base::vtbl
→ Base::dtor → Base::メンバ破棄(定義逆順にdtor) → this->vptr = 不定値

こういう流れになるはず。VC6も。

638 名前:637 mailto:sage [2008/04/19(土) 21:28:41 ]
表現がおかしかったので訂正。

× Base::メンバ初期化
○ Base::定義順にメンバ初期化
× Derived::メンバ初期化(定義順にctor)
○ Derived::定義順にメンバ初期化

ctorは「メンバの暗黙の初期化・初期化リストによる初期化」を含まないコンストラクタの中身。
dtorは「メンバのデストラクタ呼び出し」を含まないデストラクタの中身。

639 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 23:10:47 ]
VCの実装を見る限りcinやcoutはextern修飾されてるみたいですが、
宣言のみの必要な定義のいらないこれらの様なものを自分でも書くとき、
一般的にどのコンパイラでも単にexternを付けておけば良いんでしょうか?



640 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 23:21:00 ]
externが、必要がでるまでどこかで定義された実体を探す事がないという保証があるかどうか?

641 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 23:25:46 ]
日h(ry

642 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 15:26:08 ]
template<class T> struct A { struct B {}; };
template<class T> void f( typename A<T>::B ) {}
と定義して
f( A<int>::B() );
とすると

'void f(A<T>::B)' : テンプレート 引数を 'T' に対して減少できませんでした

というエラーが出るのですが、入れ子クラスではテンプレートの引数を推測でき
ないのでしょうか?

643 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 15:49:31 ]
f( A<int>::B() );

f<int>( A<int>::B() );
と推測できないかってこと?

それは無理がありすぎるな。

644 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 17:09:44 ]
逆にboost::implicit_castがこれを使っていて、
推論を抑えるため、引数の型をtypename mpl::identity<T>::typeにしている。

645 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 19:09:03 ]
BがAのテンプレートパラメータTの値をtypedefの形で保持してそれをf側で参照するようにしてやれば可能になりそうだけど
そうするとfを関数オブジェクトにしないといけなくなってC++の暗黒面に突入する…と
本当にunk言語だな

646 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:10:39 ]
何で
std::auto_ptr<char> x( new int );
はコンパイルエラーにならないんですか?


647 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:19:09 ]
おまえがどんなコンパイラと、どんなSTLの実装使っているのか非常に気になる。

648 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:23:34 ]
コンパイラは VC8 SP1 で STL はコンパイラ付属です。

649 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:11:04 ]
VC8って2005だっけ?
2008ではエラーになったぞ。



650 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:38:29 ]
8は2005

651 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 09:47:20 ]
VC++2005Expressではエラーになった

652 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 12:12:58 ]
VC7.1 だとエラーになりました。

Microsoft Visual Studio 2005
Version 8.0.50727.762 (SP.050727-7600)
だとなぜかエラーになりません。

もしかして C++ コンパイラはエラーを出す義務はないのかな?


653 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 13:26:29 ]
多分それはない。
コンパイラのバグか、誰かがヘッダ書き換えちゃったとか。

654 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 15:07:19 ]
デバッガで追いかけたら new int が一旦 std::auto_ptr_ref<char> に
変換されてから std::auto_ptr<char> に変換されていました。
std::auto_ptr_ref<T> は void* 型でポインタを記憶しているので
int 型は消えていました。
memory ヘッダーを確かめると確かにエラーが出ないはずです。
この動作は std::auto_ptr の仕様でしょうか?


655 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 15:34:39 ]
これと同じみたいだね
ttp://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101842

656 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 15:45:29 ]
いまだに信じられんな。もうすでにVC8なんて使っていないんだが、
それほど悪いコンパイラとSTLじゃなかったはずだが。

とりあえず>>654の話から想像すると、
rvalueとlvalueの境を越えるための、あまり汎用的に使い道のない、
汚いトリックを使ってauto_ptrを実装しているが(オーバーロードとtemplate argument deductionのわずかな違いを利用するやつ)
普通に使う際にも、そのトリックが働いてしまうって事かな。
STLの実装の問題っぽいかなぁ。
ふつうauto_ptr_refのメンバをvoid *にしなければならない理由はないよな。


657 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 15:48:53 ]
>>655
あ、>>656に加えて、auto_ptr_refのコンストラクタがexplicitじゃないのか。
だめじゃん、P.J. Plaugerさん。

658 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 19:51:53 ]
失礼
リソースの 切り離し / 復元 を実行するメソッドの命名に困っているのですが
この意味に近くて使いやすい単語のペアはありませんかね?
機能的に必ず対になるものです。

候補としては
[Detach / Restore] Detach の対義語は Attach だしな
[Detach / Attach] Attach は「復元」では無い気がする
[Destruction / Resotre] Destが長い
[Destroy / Restore] Destory は Create のペアとして使ってきたので控えたい
ですが、どうも腑に落ちません。

659 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 19:58:10 ]
日本語の「切り離し」と「復元」はそもそも対義語じゃないよね・・・
切り離しとその反対なら、Detach / Attach だろうし、
復元とその反対なら、Save / Restore だろう。

Destruction なんて破壊しちゃうわけでさ、英語以前に日本語の
「切り離し」「復元」ってのがそもそも違うんじゃないか?



660 名前:658 mailto:sage [2008/04/24(木) 20:08:51 ]
>> 659
> 英語以前に日本語の「切り離し」「復元」ってのがそもそも違うんじゃないか?
うーむ・・仰るとおりですね

切り離しを実行すると 消失 という状態になる処理だったので
それを元に戻す意味で 復元 と考えていたのですが
もう少し考え直してみます。 ありがとうございました

661 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:12:44 ]
漏れはホンちゃんの処理の準備のためのナニにはPrepareXXXを結構使うな。
オフスクリーンビットマップやら何やらの準備とか。

662 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:22:36 ]
release / acquire

663 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:20:14 ]
>>660
Disconnect / ReConnect とか、Detach / ReAttach とかは?

664 名前:658 mailto:sage [2008/04/24(木) 22:43:04 ]
>>661
Prepare
今回は使いそうに無いけど、ひとつ賢くなりました

>>662
そういえば DirectInput に Acquire / UnAcquire (だったかな)ってのがありますね
これ良いかも

>>663
Disconnect / ReConnect
接続とはちょっと違うんですわ

ありがとうございました
スマートに命名出来るように、もうすこし設計から見直すことにします

665 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:50:04 ]
template <template<class> class T>
このようなテンプレートテンプレートパラメータが
なぜこんな書き方ができるのか今一理解できません。
誰か上手いこと説明してください

666 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:59:29 ]
なぜ出来るのかって、そりゃ出来るように言語仕様を改定して
コンパイラが対応したからだろ・・・

667 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:34:09 ]
class X を渡せる奴は
template <class X> と書くんだから
template <class A> class T を渡せる奴は
template <template <class A> class T> と書けるようにするのが自然だろう。
むしろ他にどんな書き方があるのかと問いたい。

668 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:54:08 ]
>>667
あぁ納得。
<template <class A>

最初の例だとAの部分が無かったので混乱してました

669 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 20:13:29 ]
std::exception のメソッドの例外指定はいつの間にかなくなってしまったんですか?
ttp://msdn2.microsoft.com/ja-jp/library/c4ts6d5a(VS.80).aspx
を見るのすべてのメソッドに例外指定がないんですけど。
今まで std::exception が例外を投げないことを前提にプログラムを作ってきたんですが。




670 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 01:47:18 ]
現行規格でも次期規格の最新のドラフトでも throw() ついてるから。

671 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 02:01:34 ]
だから聞いてるんじゃね

672 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 10:46:10 ]
throw() は例外を投げない事を保証するが、
unexpected() が呼ばれて落ちる事もあるので
「throw() がついてないからどんな例外が呼ばれるか分からないから
 落ちる可能性があるかもしれないのか不安だよ!」
ってのは意外とナンセンスな悩み。

673 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 11:32:34 ]
>>672
ナンセンスな私的だな。例外安全性について勉強し直せば。

674 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 11:35:43 ]
例外指定にない例外を投げたらunexpected()呼ばれるんじゃなかったっけ

つまり例外指定はあんま意味ナス


675 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 11:40:29 ]
throw()は意味あるよ。関数の実装者がユーザに対して例外を投げない事を保証するものだから。
ユーザはthrow()を見て、例外不送出であることを期待してコードを書く事ができる。

unexpected()が呼ばれる事で、その関数の例外指定に問題があるか、実装に問題がある事をユーザ/実装者が知る事ができる。

676 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 11:58:31 ]
VCは例外指定無視する(そして"実装されてないお"と警告をだす)のでVC付属のライブラリからも外しちゃったんじゃない?

677 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 12:02:46 ]
throwをつけると、おき得る例外を特定できるから、それを期待してプログラムを書ける。
なのにそれ以外の例外が投げられるという例外中の例外がunexpectedなのだな。例外にも階層があるんだね。

678 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 12:16:40 ]
>>676
空のthrow()だけ対応していなかったっけ?

679 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 12:31:32 ]
>>678
なんかそんな気もする
帰ったら確認してみるよ



680 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 12:38:39 ]
>>678
そだよ。
書いても警告が出るだけだから。

681 名前:676, 679 mailto:sage [2008/04/26(土) 20:00:39 ]
vc9で確認してみた

Debugビルドだと、throw()指定がついた関数内に直接throw文を書くとコンパイル時に警告C4297が出る。
実行時はthrow()指定無視

Releaseビルドだと、throw()指定がついた関数内に直接throw文を書くとコンパイル時に警告C4297が出る。
実行時はthrow文のところでterminateによりabort

のようだ

682 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 20:22:06 ]
VC9は何かバグバグだな
早くSP1出して欲しい
でも年末とか言ってたような希ガス・・・・orz

683 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 21:26:34 ]
>>669
例外指定があろうとなかろうと、
投げてくる(こない)例外の種類は、規格通りだから安心して使っていいよ。

684 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 22:13:35 ]
void f( T a ) {}

f の呼び出しで a を生成するときに起きる例外は f の中で発生する
例外ですか,それとも外で発生する例外ですか?


685 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 22:16:42 ]


686 名前:なにがだ mailto:sage [2008/04/26(土) 22:30:18 ]
>>684
f()に入れる前に出ちゃってるんだから大丈夫。

687 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 22:31:58 ]
もう、出しちゃったの?

688 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 17:46:33 ]
Winsock2.0で非同期通信について教えてくれ

connectメソッド使ってサーバに接続要求して
サーバ側でACCEPTメッセージちゃんと受け取って
接続できてるのに戻り値が0にならないのは何で?

689 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 17:58:54 ]
とりあえずWSAGetLastErrorでエラー内容調べてみたら?



690 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 18:06:54 ]
>>689
やってんだけどわかんないんだ

非同期通信の場合WSAEWOULDBLOCKが返されるのは正常
という記事は見つけたんだけど、鯖立ててない状態で接続しても
WSAEWOULDBLOCKしか返らないからエラー処理出来なくて困ったちゃん

691 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 18:16:49 ]
msdn2.microsoft.com/en-us/library/ms887913.aspx
>With a nonblocking socket, the connection attempt cannot be completed immediately.
>In this case, this function will return SOCKET_ERROR and WSAGetLastError will
>return WSAEWOULDBLOCK.

692 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 20:46:47 ]
C++のnamespaceとオブジェクトに関連した質問させて下さい。

namespace Aにあるクラスまたは構造体のオブジェクトを、
namespace Bのクラスに引数として渡したいのですが、どのように
記述すればいいのでしょう?出来ればnamespace AとBは別々に、
それがダメならnamespace Aの中にBがいるように出来ればと
思っています。

C++を触りはじめたばかりでわかっていないことが多いのですが、
よろしくお願いします。

693 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 21:26:36 ]
namespace AのclassXなら「A::X」

694 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 15:26:11 ]
std::vector::size_type 型のオブジェクトは std::size_t 型の
オブジェクトに変換できるでしょうか?


695 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 16:28:10 ]
>>694
符号なし整数で、difference_typeの全ての非負数を表す事ができる。
としか書かれてないから、実装依存じゃないかな。

696 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 16:38:32 ]
教えてください。
Visual Studio 2005をつかっています。
クラスのコンストラクタ内で動的に2次元配列を生成し、
ファイルから値を入力したいのですが、
デバッグ(ローカル,this,vec_x内)で確認すると、2次元配列にはなっているのですが、
行数、列数で共に1となってしまっています。
int **vec_x;
int **vec_y;
と宣言し、コンストラクタ内で、
vec_x = new int * [ size_y ];
vec_y = new int * [ size_y ];
for(i = 0; i<size_y; i++){
vec_x[i] = new int[size_x];
vec_y[i] = new int[size_x];
}
size_y,size_xは初回のnewの次点ですでに、
300,200となっていることは確認済みです。

697 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 16:43:38 ]
>>696
何を根拠に行数、列数が1と判断したのか詳しく。
つーか、vector<vector< int> >使ったら?

698 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 16:48:51 ]
>>696
デバッガでは配列の要素数は型情報として存在しない限り
表示されないというか new [hoge] で取ったサイズは表示されないというか、
要するにただのポインタなので要素は1つしか表示されないというか、
まぁそんな感じ。

699 名前:696 mailto:sage [2008/04/28(月) 16:51:46 ]
>>697
デバッグで、ローカル変数タブからです。
this以下、vec_x(int **)を見ると、
(int *)に対応するところが1段しかありませんでした。
さらに、その下(?)の階層にも要素はひとつしかありませんでした。
>>698
その要素に値を入力したとき、
うまく領域が確保できていればどう表示されるんでしょうか。




700 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 16:59:05 ]
>>699
詳細は>698の通り。そのデバッガは(newで確保した)可変長配列に対応していないのだろう。
確保できていたかどうかを知る手段はない。
確保に失敗したかどうかは例外が送出されるので受け取ればいい。
つーか、>697の最終行。

701 名前:696 mailto:sage [2008/04/28(月) 17:13:14 ]
むしろ、その後の値の入力に問題があるのかもしれません。
ifstream ifs("FILE_NAME");
ifs >> size_x >> size_y;

for( i = 0;i<size_y;i++){
 for( j = 0;j < size_x; j++){
  ifs >> vec_x[i][j] >> vec_y[i][j];
 }
}
としています。
入力ファイルの中身は、
整数(半角スペース)整数
整数(半角スペース)整数
...
となっており、最初にsize_x,size_yを入力しています。
size_x,size_y,vec_x[0][0]は正しく入力されたのですが、
vex_y[0][0]には正しい値は入っていません。
その後のvex_x,vec_yの各要素の値に関しても同様に正しい値は入力されませんでした。

>>697
STLはややこしくて全く手をつけていません。
お恥ずかしい限りですが…。

702 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 17:30:54 ]
>>701
g++ で一応試したけど、配列は >>696 で問題無いよ。
俺も STL 使った方がいろいろと簡単だとは思うけど。

703 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 17:40:17 ]
STLに限らず、まとまった規模の情報は何でもそうだけど、遠目に見ているうちは
頻繁に使うものと滅多に使わないものが「同じ大きさ」に見えるんで、
無駄に全容を眺めてしまって、「難しそうだなぁ」という気持ちばかり膨らんでいく。

実際には「STLを使う」ってのは、その殆どがつまり「コンテナを使う」ってことで、
これ自体はめちゃくちゃ簡単な話だよ。

704 名前:696 mailto:sage [2008/04/28(月) 18:00:02 ]
ありがとうございます。
STLを勉強してみたいと思います。
今回は(x,y)のようなベクトルによって構成された、
2次元配列を二つ作ることを考えています。
vector<vector< int> > vect1(size_y,vector<int>(size_x));
として、vect1[y][x]として要素にアクセスすればいいのでしょうか。
ttp://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=162

この場合のコンストラクタの動作が理解できません。
第二引数のvector<int>(size_x)でvect1を初期化するのでしょうか。

705 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 18:57:24 ]
>>704
それで使い方はいいよ。

違うよ。2個目の引数は vect1 の各要素を初期化というか instantiate してる。
constructor は 2 つ引数あるときは個数と各要素。

706 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 21:50:55 ]
>>705
下の文に引用が無いから
> それで使い方はいいよ。
> 違うよ。
が繋がった感じで、なんかワロタ

707 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:42:23 ]
クラスAからpublic派生したクラスBで、クラスA分のメンバ関数をprivateにしたいんですが
Virtual付いてると宣言だけじゃ駄目なんでしょうか?
環境はBCB5+XPです

class a {
public:
void Test1() {};
virtual void Test2() {};
};
class b : public a {
private:
void Test1(); //OK
virtual void Test2(); //リンカエラーが出る
};


708 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:56:01 ]
virtualは関数の実体を定義しないとエラーになるよ。

709 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:58:16 ]
それが許されたとして、aの中でよんでいるTest2はどうなるのか興味浦々



710 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 14:13:48 ]
う〜んそうだったんだ。
a.Test2()で実体があるから、問題ないんじゃないかと思ってたけど
違うのか。
すごく勉強になったよ。ありがとう〜

711 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 15:04:23 ]
class b : public a {
private:
using a::Test1;
using a::Test2;
};

やりたいのはこういうことか?

712 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 17:43:05 ]
>>711
この書き方は知らなかった。
usingについて調べてみます。

713 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 23:24:42 ]
じぇねれーてぃぶこーどって本
買ったけどC++のソース部分読めない
たじゅけて

714 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 00:30:03 ]
出版社に送って新しいのと取り替えてもらえ


715 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 00:47:17 ]
無限ループになる悪寒

716 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 07:55:38 ]
>>714
当社では、「落丁・乱丁」の場合のみお取替えをさせていただいております。

大変申し訳ありませんが、「ソースコードが理解できない」お客様につきましては、
対応いたしかねますので、ご了承いただけますよう重ねてお願いいたします。

717 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 13:45:51 ]
>>713
何がそんなに難しいの? template とかの勉強が必要なのかな?

718 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:30:53 ]
じぇねれーてぃぶこーどなんて本あったっけ?

719 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:38:16 ]
日本語ではなかった気がする



720 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 10:14:01 ]
これかぉ?
www.seshop.com/detail.asp?pid=9025

721 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 11:32:55 ]
hoge


722 名前:デフォルトの名無しさん [2008/05/06(火) 11:39:15 ]
int main ()
{
static int i (0);
struct Local
{
static void increment ()
{
++ i;
}
};
Local::increment ();
}
関数内のクラスのstaticメンバ関数(Local::increment)から
関数内の変数(i)を触れるのは規格に合ってる?
g++.real (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
では触れるのだけど.


723 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:12:30 ]
スタティックなメンバ関数からスタティックなメンバ変数が見えるのはいいんでないかい?
別に矛盾はないと思うし。
スタティックなメンバ変数ってのは、スコープ限定のグローバル変数みたいなもんだしね。

724 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 15:28:06 ]
>>723
そういう事なんだろうね。俺も >>722 さんの code 見てちょっと
えっ?て思ったけど、気分悪いがはっきりと間違っているとも言えない。
実際 compile してみると走るし(g++ 4.1.1)。どちらの static でも
外せば compile しない。

725 名前:722 mailto:sage [2008/05/06(火) 15:42:33 ]
>>723,724
規格に合っているみたい.

9.8.1に
722ほぼそのまんまの例が載ってました.


726 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:05:22 ]
int* array[10];
ってnewでやる場合どう書けばいいですか?

727 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:07:39 ]
array[0] = new int[931];

728 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:26:29 ]
>>726
もっと分かるように質問しろお( ^ω^)

729 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:31:01 ]
int** array = new int*[10];でしょjk



730 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:32:22 ]
C++のソースコードをアセンブラのコードに変換する方法があるって聞いたんですが
どうやればいいか教えてください
コンパイラはVCです

731 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:34:11 ]
コンパイラオプションで「アセンブリコードを出力する」に設定する

732 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:36:49 ]
730です
ありがとうございます

733 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:02:34 ]
void F( vecotr<int> &vec )
{
struct T
{
void operator()( int i ){ printf( "%d\n", i ); }
};

for_each( vec.begin(), vec.end(), T() );
}

こういう奴で、struct TをFのスコープ外にすると通るんだけど、
スコープ内だと通らない。
なんで?

なんで?って考えちゃダメ?

734 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:04:20 ]
>>733
関数ないクラス、構造体はtemplateクラスやtemplate関数にtemplate引数として渡せないと仕様で決まっている。

735 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:05:23 ]
誤字修正
x 関数ないクラス
o C++仕様もまともに知らない奴は死ね

736 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:07:32 ]
x 関数ない
o 関数内

こういうことだろ

737 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:18:35 ]
x こういうことだろ
o べ、別にあんたの為に修正してやってるんじゃないんだからねっ!

738 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:35:33 ]
>733
C++STDの14.3.1.2で不可になってますな。
コンパイル時に特定する必要があるので、外部リンケージの無い要素を指定できないんですな。
そういう意味で文字列リテラルも不可。
#文字列リテラルを実引数にできると色々と面白いんだけど、しようがないか……

739 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:49:27 ]
外部リンケージ?



740 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 18:10:55 ]
ケータイ小説・千の風になっての評価

評価者:ミカ  評価:★★★★★
ミカと同じ名前で同じ歳の子がこんなひどい人生を送るなんて!!
信じられない!!
一晩中泣きました!!

評価者:サナエ 評価:★★★★☆
これがあたしたちのリアル。

評価者:ち†ょ⊃ 評価:★★★★★
寝ゐ前|ニ言売ゐ女台め†ニяа止маω†ょ<τ
冫欠σ日シ立L≠†ょカヽ〃яа学木交|ニ彳テL≠маU†ニ



741 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 19:53:49 ]
ちなつ
寝る前に読み始めたら止まんなくて
次の日泣きながら学校に行きました

同じ文字を複数の文字にあてたり、いきなりローマ字とか出てくるとワケワカメになるね。

742 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:39:31 ]
ドストエフスキー小説・罪と罰の評価

評価者:ラスコーリニコフ  評価:★★★★★
僕と同じ名前で同じ歳の人がこんなひどい人生を送るなんて!!
信じられない!!
一晩中泣きました!!

評価者:ドストエフスキー 評価:★★★★☆
これがあたしたちのリアル。

評価者:ポルフィーリィ 評価:★★★★★
予審前に読み始めたら止まんなくて
次の日泣きながら仕事に行きました

743 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:57:43 ]
おい
自演してる奴がいるぞ
しかも評価は控えめw

744 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 16:17:28 ]
1         2           3           4

.     __                       __             _ 
    ,i,_,i_        ,-,_         ,-i,_,l 、      :.. :. ≡=-i'__l, 
    |  `i         /'-' `i         //l   l       iコ==ラ`'i ti 
    | lヽi li,   →  | lヽl li   →   l i,,l   l |   →     ./  /l/
    | l-'l |,l       | | // l        `"|iコ=''         /  /
.    'Fヲ|,H      E三l_l_A         | .i .|         /  / 
    ,i_| .| |                   | || |         i' /l .l,
     -'‐'                      | || |_       l l .ヽ,ヽ, 
                          ‐' ' `‐'       -'-'  -'-' 
    脱ぐ       たたむ      プログラムを     src と dest を
                         つくる      まちがえる。

745 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 19:02:05 ]
>>742
>評価者:ポルフィーリィ 評価:★★★★★
>予審前に読み始めたら止まんなくて
>次の日泣きながら仕事に行きました

あんたが言うせりふやない。

746 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 19:23:43 ]
>>744
ワロタ

747 名前:デフォルトの名無しさん [2008/05/10(土) 15:18:13 ]
重複しない複数の座標値、x,y,zという3つのキーを用いて、
そのキー(座標)の要素に値を代入、変更する処理を行おうと思っています。

現在、

class XYZ
{
 int x;
 int y;
 int z;
 int value;
};

としてXYZの配列を計算したい領域分だけ確保しているのですが
任意のx,y,zで値の変更があった場合,そのキーの要素を検索して参照、代入する方法として
何かよい方法はありませんでしょうか?
よろしくお願いいたします。

748 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 15:20:47 ]
管理が冗長すぎるだろ

749 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 15:30:18 ]
std::map<int, std::map<int, std::map<int, int> > > m;
m[x][y][z] = value;



750 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 15:45:35 ]
m[x][y][z]って・・・

751 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 15:56:35 ]
志村XYZのDVDって出てたっけ?

752 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 17:33:03 ]
>>747
言いたいことがよくわからない。
キーが与えられたら要素を返す method と代入する method (というか
メンバ関数)を作るってことじゃないの?変更がどうあるのかもよくわからん。

753 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 17:47:52 ]
XYZにoperator< を定義してsetに突っ込む

754 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 17:52:37 ]
>>747
3次元座標値ってどんな領域なのよ?

まず問題の概要を説明しやがれ
このスカポンタン

755 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 17:55:46 ]
>>754
そこは重要じゃないだろ

756 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 18:01:09 ]
これでいいだろ
#include<map>
class XYZ {
int x, y, z;
public:
XYZ(int x, int y, int z) : x(x), y(y), z(z) {}
bool operator<(const XYZ& rhs) const {
return x < rhs.x || (x == rhs.x && (y < rhs.y || (y == rhs.y && z < rhs.z)));
}
};
int main()
{
std::map<XYZ,int> m;
m[XYZ(0,1,2)] = 100;
}

757 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 05:35:20 ]
#include <new>
としているコードを見かけますが、
わざわざ<new>をインクルードするのなぜなのでしょうか?
インクルードしなくてもnewは普通に使えますよね?

758 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:02:53 ]
いらないと思うんだった、コメントアウトして再コンパイルしてみればいいんじゃね?

単に習慣でインクルードしてるだけかもしれないし。

759 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:14:42 ]
placement new, std::nothrow, std::bad_alloc を利用する際にインクルードするヘッダファイルであって、
普通の new を使うためにインクルードするヘッダファイルではない。



760 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:23:57 ]
>>757
precement newやnew演算子のオーバーロードをするときに使う。


761 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:28:16 ]
オーバーロードする際に必要だっけ?

762 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:28:52 ]
そんな事はない

763 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:29:54 ]
だよねー

764 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 12:34:18 ]
かわいい女の子が寝る前に
1分間枕元に立ってくれるための
おまじないだと、先輩から聞いたことがる。

765 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 15:51:39 ]
映画版呪怨ですね。わかります。

766 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:39:48 ]
struct xstring_traits{
   bool is_w() const {...}
   ...
};
struct vstring_ref { // デフォルトコピーコンストラクタ使用
   const xstring_traits* tr_;
   const char* begin_;
   const char* end_;

   const wchar_t* wbegin(){return tr_->is_w() ? reinterpret_cast<const wchar_t*>(begin_) : NULL;}
   ...
};
struct vstring_buffer {
   const xstring_traits* tr_;
   char* begin_;
   char* end_;
   ...
};
struct vstring {...}; // コピーでメモリ再確保

767 名前:766 mailto:sage [2008/05/12(月) 00:40:35 ]
(続き)

やっぱ引数がconst std::stringだと
std::string以外から受け取る場合のコストが気持ち悪いし、
const char* でことあるごとにstrlenとかするのも無駄だし、
WindowsだとTCHARとかの場合もあるけど、
WinAPIに関係無い部分にまで<tchar.h>入れるの嫌だし。

で、ただでさえ多い文字列クラスをさらに増やすのかと
葛藤しつつも自作文字列クラスを・・・。

皆はやっぱり普通にstd::string?
Windowsの場合は、
typedef std::basic_string<TCHAR>する人もいるよね。

768 名前:766 mailto:sage [2008/05/12(月) 00:41:33 ]
×引数がconst std::string
○引数がconst std::string&

769 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:55:18 ]
俺は、普段はconst std::string&で済ます。
std::basic_string<TCHAR>のtypedefもWindowsプログラムならよく使う。
767も言うコストが気になるならRangeを引数に取るテンプレートにする。



770 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:29:45 ]
スレチだけど俺は TCHAR でちゃんと動くコード(mbcsをちゃんと処理するコード)を
書く気はさらさらないので、欺瞞的なTCHARの使用はなるべく避けてWCHARにしてる。

771 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:44:18 ]
俺も全部 TCHAR で書いてるけど、string::find とか平気で使ってるわ。
mbcs じゃほとんど動かんコードになってる。

772 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 07:10:43 ]
>>767
文字数が必要ならこうする手も。

void hoge(const char* str, size_t len) { }
inline void hoge(const std::string& str) { hoge(str.c_str(), str.length()); }

773 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 13:28:40 ]
なんで、private継承、protected継承すると、アップキャストができなくなるのだ?

774 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 13:44:30 ]
外からprivateなメンバにアクセスできないのと同じ
外からprivateな基本クラスにはアクセスできない

775 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 13:48:23 ]
>>773 外からできなくなるだけで、中からならアップキャストできるよ。

776 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:32:36 ]
private継承するboost::operatorsがなんで動作するのかも良くわかんないな。

777 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:41:24 ]
分かんない事ばかりなのに使わなければならないC++って、怖くね?

778 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:47:31 ]
>>776
friend関数はクラスのメンバではないから・・・かな?

class A {
private:
  friend void foo() { ... } // メンバのように見えるけど実はグローバル関数なのでアクセス制御は効かない
};
int main() {
  foo();
}

779 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:48:13 ]
C++以外の言語も使いますが分からないことだらけです。



780 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 19:36:07 ]
何が分からないか判っていれば解ったも同然だ

781 名前:デフォルトの名無しさん [2008/05/13(火) 19:54:24 ]
friend関数、VC2005からtemplate<class T>を頭につけないと
コンパイルが通らなくなったんですね。C++0xはまだなのに
こういう仕様変更はひそかにやってるんですか?

それとも、もともと規格書にはこう決められていてやっと
Vc++2005で対応できた、ということですか?

782 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 20:31:33 ]
>>777
わかんない部分は無理して使う必要はないし。
でも、わかった後それを使うと今までだらだら長く書いていたコードがすっかりコンパクトにまとまってショックを受けることが多々ある。


783 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 20:43:20 ]
>>781
それは後者

でも前者みたいなひそかな変更もVC++はよくやる。
いや、きちんと文書化されているけどね。
例えばtype traits支援とかC99の%a書式とか。

784 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 12:41:47 ]
もう C++ なんて好きでもないし使いもしない理由。
ttp://www.hyuki.com/yukiwiki/wiki.cgi?WhyINoLongerLikeOrUseCPlusPlus

悔しいけど納得した。


785 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 13:24:39 ]
確かにめんどくさいし手間が掛かる…

786 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 14:04:26 ]
C++ Programming Languageを端から端まで二度読める知能があれば右辺値参照ごときにどうして瞼が落ちるのか。

787 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 14:14:04 ]
落ち着かない仕様
時間の掛かる修正
度重なる保守

788 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 14:15:27 ]
C++は仕事に向かない言語とういのには同意だな

789 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 14:30:05 ]
C++ Programming Languageを二度読むのに必要なのは知能ではなくて忍耐力だからな



790 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 14:57:10 ]
性能に取り憑かれているのは自分でも気づいているがどうしてもやめられない。

791 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 15:08:56 ]
Java も使うけど、C++ の方が楽に感じる事多いな。
気を付けないと保守が大変というのはわかる。
ただ、どの言語でも保守の問題はあるし、気を付ければ
そんなに問題ないと思ってるけど。まぁ、5年後になんて
言っているかはわからんが。


792 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 15:57:49 ]
C++の全機能を使わなければならない、という規約でもあったのだろうか?
演算子オーバロードは危険だと思ったなら、単にその機能を使わなければよい。
参照は不要でポインタがあれば十分だと思ったなら、単にその機能を使わなければよい。
添え字が範囲の中にあるかテストしてほしいと思ったなら、at()メンバ関数を使えばよい。

なぜ、C++の全機能 vs Cの比較なんだろう?
C+α(Better C) vs Cの比較をしないのはなぜだ?

要するに、マヌケだってことだ。

793 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 16:00:18 ]
>>784のリンク先

C++に過剰に複雑なところがあるのは同意なので、
その人(翻訳者でなく)がC++嫌ですって言うこと自体に批判は特に無いけど、
ちょっとツッコミ書くてst。

>C の方を使いたくなる
別に複雑な機能を使わなくても、
 ・#defineマクロ(MAXなど)の代わり程度のtemplate
 ・fopen,fcloseみたいなのをRAIIに扱うための極薄ラッパー
などの簡単で便利なものだけ「better C+おまけ」程度に使えば良いと思う。
巧みで知識もあると言う割には、要領が悪い気がしないでもない。

>Java や Groovy に
そこでGroovyは無いと思う・・・

俺もjava好きだから良いんだけど、
もうちょっと他の言語も挙げれば良いのに・・・

794 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 16:17:12 ]
>そこでGroovyは無いと思う・・・
ググったら実質両方Javaでワロタw

795 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 16:22:57 ]
>>792
> C+α(Better C) vs Cの比較をしないのはなぜだ?
自分一人で遊んでいるときしか、そういう使い方がうまくいかないからでは。

796 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 20:19:22 ]
なぜ今更そのネタを

797 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:02:02 ]
>>792
> C++の全機能を使わなければならない、という規約でもあったのだろうか?
あるとしたら逆だろう。○○しか使ってはいけない、という規約が無くてカオス化する。
あるいは、そういう規約がちゃんと機能して、自分の仕事がうまくいっているとしても、
「ここまでの規約が無ければ収拾つかなくなるC++って・・・」という虚しさは感じることになる。

「C++に文句を言う奴は、C++を使い切れないマヌケだけ」
というのは、C++信者の反撃としては割とお約束だし、部分的には当たっている。
実際、「一人でちょっとしたものを作ることさえできない」人間の八つ当たりも結構見られるし。
ただ、C++の難点というのは、主に「個人の能力ではどうにもならないところ」に表れるものであって、
この話を個人の能力に全部収めて着地させようというのは、わかっててやってるなら
いかにも姑息な「問題のすり替え」ではある。

798 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:14:38 ]
> 個人の能力ではどうにもならないところ
ってどこだろう

799 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:19:29 ]
他人の脳味噌は自分の脳味噌ではない、という事実とか、
そういう風にして複数の脳味噌によって構築された「すんげえ規模」とか。



800 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:21:47 ]
名前マングリングとかABIとかじゃね

801 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:37:50 ]
C++最高!とまでは言わないが、ハードと離れた言語は使う気しないな

802 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:39:21 ]
>>799
それはC++に限った話じゃないな
CでもJavaでもPHPでもよくある話だ

>>800
ABIが規定されていてうまく機能している言語ってあります?

ちなみに、自分はC++信者なわけではない
素直な感想と疑問

803 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 22:46:45 ]
>>797
どの言語でも仕事で coding する時は文法的に正しければなんでも良い
なんてことは無いはずだが。規約を全く無くせば収拾つかなくなると思うが。
規約を決めるのを C++ に限ったことではない。

元の記事はむしろ binary の compatibility を問題にしてるんじゃないかな。

804 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:05:02 ]
>>802-803
「有るか無いかでいったら、どの言語にだってあるぞ」
というのは確かにその通りだけど、この場合はC++の「度合いのひどさ」を問題にしているわけで、
ゼロじゃないからどの言語もみんな仲間! ってのは、話の持って行き方としてちょっと違うと思う。

805 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:15:56 ]
>>804
でもJavaぐらいだと>>799の問題は似たようなものな気がするけど
だんだん複雑になってきてるし
ある程度表現力が高い言語になると普遍的な問題じゃないかな

C++だとまともに書けない人でもJavaなら書けるのだろうか
そんな人がPythonならまともに書けるのか?

806 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:39:39 ]
規模の問題はちょっと違うだろうね。

名前マングリングに関しては確かにC++のは委員会とかの人も
普通に「どうにかしたい」って思ってそうだけど、
実質、ABIがさえ合えば問題無し、って程簡単じゃないから
再コンパイルした方が良い。

UNIX、Linux系ではオプションの変更程度で再makeすることも多いし。
それに完全にバイナリで使うなら.soとか.dllで考え方が良い。

807 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:46:07 ]
例外とか this ポインタの実装手段の違いとかも問題になるんじゃね。

808 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 00:27:21 ]
>>797 で言っている問題で、何でも使うか使わないかは、
compile し直そうが残る問題が多いけど。特に保守性考えると。

件の ABI の問題は compile し直せばいい問題じゃないの?
(だから問題になりえないと言っているわけではないが)

ちょっと違うことを問題にしていて議論が混ざってる気がする。



809 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 21:20:35 ]
質問があります

代入演算子をprotectedないしprivateにしたいんですが、
実装はデフォルトで生成されるものそのままでいいんです

class Hoge
{
 // さまざまなメンバ変数(代入演算子があったりなかったりする)
 Hage hage;
 Fuga fuga;
 int hensuu;
protected:
 Hoge& operator=(const Hoge&);
};

ってやったらリンクエラーになるんですがどうすればいいでしょう
イチイチ中身書くのも面倒で・・・



810 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 22:07:43 ]
イチイチ中身書くしかない

811 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 23:25:47 ]
C++0x では default キーワードでデフォルト実装を作ってくれるそうです。

812 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 23:26:25 ]
handle-bodyイディオムで書いて、handleの代入演算子をprotectedなりにすればどう?

813 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:09:30 ]
バイナリとしての0x00をchar配列に格納したいんですが、終端文字として認識されてしまいます。
こういう時ってどうすればいいのでしょうか??
ご教示いただけると幸いです。


814 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:16:56 ]
もしかしてstrcpyとか使ってるのか?

815 名前:デフォルトの名無しさん [2008/05/17(土) 01:21:39 ]
レスどもです。
いえ、const char [] 型に0x00を含む文字列を格納して、cout とかで出力しようとすると0x00以降が出力されないんです。

816 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:22:37 ]
考えるだけでも恐ろしい

817 名前:デフォルトの名無しさん [2008/05/17(土) 01:22:59 ]
それは当たり前 仕様 0は文末というのが原則です。

818 名前:デフォルトの名無しさん [2008/05/17(土) 01:24:21 ]
出力させたいんだったら、string使えば出来るはず。 こっちはサイズまではちゃんと出力したと思う。
たとえばstr.resize(10000,'\0'); cout<<str;とする。

819 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:24:53 ]
とすると、バイナリとしての0x00を途中に含むchar文字列を作りたいんですが、無理なんでしょうか??




820 名前:デフォルトの名無しさん [2008/05/17(土) 01:25:58 ]
0を含むchar配列はできるよ でもstrlenとかは間違える 自分で長さを管理すればよい。

821 名前:デフォルトの名無しさん [2008/05/17(土) 01:27:56 ]
たとええばchar配列で0を含まないならstrcpy、strcmpなどを使い、
0を含むなら長さを自分で指定するmemcpyやmemcmpを使う。

822 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:28:55 ]
いや作れるよ
char配列の内容がNTCSであることを仮定している関数・APIに
NTCSでないchar配列を突っ込んでいることが間違いなだけ

823 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:47:42 ]
なるほど!
0x00を入れると格納はされているけど出力できていなかったということですね。
長さを指定したら出力できました。
レス下さった方々ありがとうございましたm(_ _)m






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<200KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef