■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part49
501 名前:デフォルトの名無しさん :2006/05/14(日) 02:12:50
仕事の憂さ晴らしなら雑談スレでしてほしいところだ

502 名前:デフォルトの名無しさん :2006/05/14(日) 02:13:01
>>499
意味わからん。 ISO の文書読んだら、戻り値は int 以外無いだろ?

503 名前:デフォルトの名無しさん :2006/05/14(日) 02:14:09
最初のレスで何に噛みついたかでカテゴリ1に分類されているわけだが

504 名前:デフォルトの名無しさん :2006/05/14(日) 02:14:53
>>502
ほらな
484 を君は何と読んだんだい (ニヤニヤ

505 名前:デフォルトの名無しさん :2006/05/14(日) 02:15:30
日本語が怪しい人がいますね

506 名前:デフォルトの名無しさん :2006/05/14(日) 02:16:34
え……?

507 名前:デフォルトの名無しさん :2006/05/14(日) 02:16:57
>>505
それは仕方ないよ、処理系定義という日本語を日本人全員が知ってるわけでもないのと同じ
問題はプログラム技術板で鼻息を荒くしてることであって

508 名前:デフォルトの名無しさん :2006/05/14(日) 02:19:11
誰の鼻息が荒いの?

509 名前:デフォルトの名無しさん :2006/05/14(日) 02:19:12
ちょっと頭の悪い方がいるようです

510 名前:デフォルトの名無しさん :2006/05/14(日) 02:20:10
>>507
あれを「戻り値の型は実装定義」と読んでるようだな。
実装異存なのは main 関数の型だよ。

511 名前:デフォルトの名無しさん :2006/05/14(日) 02:21:41
otherwiseの意味が若干とりにくいですけれどね

512 名前:デフォルトの名無しさん :2006/05/14(日) 02:22:31
>>510
おーい、訳が無茶苦茶で通じてねえぞ

513 名前:デフォルトの名無しさん :2006/05/14(日) 02:26:47
>>512
ここはひとつ、あなたの解釈を書いてみてもらえますか?

514 名前:デフォルトの名無しさん :2006/05/14(日) 02:27:42
>>513
あっかんべー
どうしても教えて欲しければ有料だよ乞食さん

515 名前:デフォルトの名無しさん :2006/05/14(日) 02:29:25
意味の通るところで改行するという定義に合わせるなら
あの文章の前後の文もないとつらくないか?

516 名前:デフォルトの名無しさん :2006/05/14(日) 02:32:44
>>512の訳が知りたい。

>>510以外のどういう解釈があるのかと。

int main()
{
  std::cout << typeid(main).name() << std::endl ;
}

517 名前:デフォルトの名無しさん :2006/05/14(日) 02:36:11
今時あっかんべーも無いだろう。釣りにしてもあからさますぎ。

518 名前:デフォルトの名無しさん :2006/05/14(日) 02:38:45
>>516
聞き方が収束したようだな

519 名前:デフォルトの名無しさん :2006/05/14(日) 02:43:55
しょうがないから JIS の訳を引用してあげる。
> 関数 main は多重定義してはならない。その返却値の型は, int とする。
> これを除いて,関数 main の型は,処理系定義とする。

520 名前:デフォルトの名無しさん :2006/05/14(日) 02:57:20
鼻息野郎は逃げたようだな。いやよかった。

521 名前:デフォルトの名無しさん :2006/05/14(日) 03:23:15
オブジェクトの初期化だの引数の渡し方だのを C の話でやろうとしたことを棚に上げて
main の話に逃げ込んだのがどっちかは明らかだがな

522 名前:デフォルトの名無しさん :2006/05/14(日) 03:26:40
まだいたのか、この超ロングヘアーのフサフサ

523 名前:デフォルトの名無しさん :2006/05/14(日) 03:27:25
>>522 スレ限定の罵倒だな

524 名前:デフォルトの名無しさん :2006/05/14(日) 03:29:21
main には 「型」 があるそうだが、こんなのが型かよまったく

extern "C++" typedef int f1();

extern "C" typedef int f2(int, char *[]);


extern "C" f1* p1;

extern "C++" f2* p2;


extern "C++" int main()

{

p1 = &main;

(*p1)();

}


extern "C" int main(int, char *[])

{

p2 = &main;

(*p2)(0, 0);

}

525 名前:デフォルトの名無しさん :2006/05/14(日) 03:46:37
>>524
> main には 「型」 があるそうだが、こんなのが型かよまったく

そうだ。 C/C++ の関数には型がある。君はそれを知らなかったんだ。覚えておけばいい。
間違いを偉そうに撒き散らしたのを謝って反省するともっといいね。

526 名前:デフォルトの名無しさん :2006/05/14(日) 03:52:47
>>525
言いたいことが通じてないようだが
int 以外の返却値を認めてない背景にある問題が
スタートアップモジュールとのスタック構造の一致にあり
それこそが型に他ならないと指摘している

オブジェクトの初期化だの引数の渡し方だのを C の話でやろうとした奴だからこそ
main の結合が処理系定義とか言う話にも何の疑問も感じないんだろうが
そういうレベルの輩と真面目に話しているつもりは最初からないんで
何が間違いかがあんたらとは認識ちがいそうだよ

527 名前:デフォルトの名無しさん :2006/05/14(日) 03:56:53
>>525
俺に知らなかったと言うあんたは 524 のプログラム片に含まれる ill-formed を全て指摘できるのか

528 名前:デフォルトの名無しさん :2006/05/14(日) 03:57:25
スーパークラスにサブクラス型のメンバを持たせたいのですが
方法ありませんか?どなたかよろしくお願いします。

class SuperClass{
ExtendClass* ec;
};

class SubClass:public SuperClass{
};

529 名前:C・アズナブル :2006/05/14(日) 03:59:02
見苦しいものだな
苦し紛れの言い訳とは。

530 名前:デフォルトの名無しさん :2006/05/14(日) 03:59:05
>>528
実体を持たせようとするとサイズが無限になることくらいはわかるか?
やるならポインタで指すだな

531 名前:デフォルトの名無しさん :2006/05/14(日) 03:59:45
>>529
自分が根に持っているものに疑問を感じたら態度違うさ

532 名前:デフォルトの名無しさん :2006/05/14(日) 04:02:59
超先生がいるスレはここですか?

533 名前:デフォルトの名無しさん :2006/05/14(日) 04:03:18
>>526
関数の型は、戻り値と引数リストで決まる。スタック構造の一致は実装の都合。

引数の渡し方については C の話で問題ない。
>>477 が誤解しているのは明らかに値渡しの理解。これを理解せずに
>>482 のようにコードを変更してうまくいったとしても、同じ間違いを繰り返す。

オブジェクトの初期化だのについては、君以外だれも何も言っていない。

534 名前:デフォルトの名無しさん :2006/05/14(日) 04:03:25
言い負かすのに失敗したからといって、それがイコール自分の間違いとは認識しないことがある
527 をスルーで煽りに転じるだけな者に型を語られても説得力がないことに変わりがないように

535 名前:デフォルトの名無しさん :2006/05/14(日) 04:04:00
>>527 main 関数のアドレス取っちゃだめですぅ

536 名前:デフォルトの名無しさん :2006/05/14(日) 04:06:17
>>533
>関数の型は、戻り値と引数リストで決まる。スタック構造の一致は実装の都合。
違う
結合は明白に関数の型の一部である
gcc などで試した結果のみが根拠な者がそのような誤解をするのは当然

>引数の渡し方については C の話で問題ない。
よってこれも誤り


>オブジェクトの初期化だのについては、君以外だれも何も言っていない。
そのとおり、重要なことを放置したまま話が逸れていったんだよ

537 名前:デフォルトの名無しさん :2006/05/14(日) 04:06:33
>>535
他には?

538 名前:デフォルトの名無しさん :2006/05/14(日) 04:07:13
何かに似てると思ったらエンコリ翻訳ににてるのか

539 名前:デフォルトの名無しさん :2006/05/14(日) 04:08:46
>>537 main 関数は多重定義しちゃだめですぅ

540 名前:デフォルトの名無しさん :2006/05/14(日) 04:09:02
>>539
他には?

541 名前:デフォルトの名無しさん :2006/05/14(日) 04:11:17
>540
レスがワンパターンになってるぞ。もう終わりか?

542 名前:デフォルトの名無しさん :2006/05/14(日) 04:12:27
>>541
>>527 からの流れを参照されたし

543 名前:デフォルトの名無しさん :2006/05/14(日) 04:13:14
>>540 main の多重定義に付随していろいろ出てくるが、それも全部挙げさせるつもりか?

544 名前:デフォルトの名無しさん :2006/05/14(日) 04:17:13
// 配列のテスト
//
#include <iostream>
using namespace std;

int main()
{
 char c[10] = "あいう";
 char *s = "abcd";
 char ch[10] = "わをん";

 cout << " s:" << s << endl;
 cout << " c:" << c << endl;
 cout << "ch:" << ch << "\n" << endl;

 s = (char*)c;
 cout << "c => s:" << s << "\n" << endl;

 cout << "現在のch:" <<ch << endl;
 cout << "現在の s:" << s << "\n" << endl;

 // @
 for (int i=0; i<10; i++)
  s[i] = ch[i];
 cout << "ch => s:" << ch << "\n" << endl;

 return 0;
}

文字列を各配列に納めるテストをしていたのだけれど
目印@でのキャスト処理を for構文つかわずに
s = (char*)c; のように簡略化できる方法ありますか?

545 名前:デフォルトの名無しさん :2006/05/14(日) 04:18:48
>>543
ill-formed に対する処理系独自の解釈に起因する連鎖で出るエラーはいいよ
直接的に ill-formed な箇所がわからない者には説得力がないと言っているだけなんで

546 名前:デフォルトの名無しさん :2006/05/14(日) 04:21:27
>>536
明白ってのは根拠があって言ってるのか?

規格を読む限りでは、戻り値型と引数リストの型が関数型の構成要素だよ。
非staticメンバ関数について型修辞子が追加される。
デフォルト引数や、例外仕様は含まれないことも明記してある。
リンケージについての記述は見当たらないが、 static つけたら型が変わられちゃ
困るんで、そんなものは関数型の一部ではない。

どうも「関数の型」が規格上に定義されたものだという前提が無いようだな。

> よってこれも誤り
「よって」が前の文と繋がってないよ。

> >オブジェクトの初期化だのについては、君以外だれも何も言っていない。
> そのとおり、重要なことを放置したまま話が逸れていったんだよ
どうでもいいから誰もタッチしてないんだよ。

547 名前:デフォルトの名無しさん :2006/05/14(日) 04:22:22
>>544
std::string 使え。

548 名前:デフォルトの名無しさん :2006/05/14(日) 04:23:24
>>546
static は型の一部ではない
extern "C" は関数の型の一部である

>どうでもいいから誰もタッチしてないんだよ。
どうでもよくないが、ここであんたに考えを改めてもらう必要もないんで放っておく

549 名前:デフォルトの名無しさん :2006/05/14(日) 04:23:38
>>545 じゃぁ ISO の規格的にはもう無いと思うよ。君の脳内にはなんかあるみたいだけど。

550 名前:デフォルトの名無しさん :2006/05/14(日) 04:25:29
>>549
ご苦労様
不合格ね

551 名前:デフォルトの名無しさん :2006/05/14(日) 04:27:30
>>530
すみません。コード間違えました。やりたいのは
class SuperClass{
SubClass* sc;
};

class SubClass:public SuperClass{
};

です。
>実体を持たせようとするとサイズが無限になることくらいはわかるか?
分かりません。でもポインタで指しているつもりです。

コンパイルを通したいのですが、どう宣言したら良いものか。

552 名前:デフォルトの名無しさん :2006/05/14(日) 04:31:57
class BaseClass {
public:
virtual ~BaseClass();
};

class SuperClass{
BaseClass* pSubClass;
};

class SubClass:public SuperClass{
};

とやっておいて、dynamic_cast とか

class SubClass;

class SuperClass {
SubClass* sc;
};

class SubClass : public SuperClass {
};

のように不完全型を使うとか・・・

553 名前:デフォルトの名無しさん :2006/05/14(日) 04:52:07
>>548
> extern "C" は関数の型の一部である

これは正しいようだ。 7.5.1 に書いてある。

ということは、 >>524 での p1, p2 への代入が関数型の不一致ってことか?
p1, p2 の宣言に付いてる extern "" は関数型には影響しないんじゃね?
↓こうなってればダメってのはわかるんだけどね。
extern "C" int (*p1)();
extern "C++" int (*p2)(int, char*[]);

554 名前:デフォルトの名無しさん :2006/05/14(日) 04:52:36
>> 552
ありがとうございました。下の方法でうまくいきました。
ダイナミックキャストは勉強しておきます。

555 名前:デフォルトの名無しさん :2006/05/14(日) 04:57:23
>>554 dynamic_cast 使わない方法をさがそうね。

556 名前:デフォルトの名無しさん :2006/05/14(日) 04:59:05
dynamic_castってなあに?

557 名前:デフォルトの名無しさん :2006/05/14(日) 05:01:36
>>556 http://www.google.co.jp/search?q=dynamic%5Fcast

558 名前:デフォルトの名無しさん :2006/05/14(日) 05:10:25
>>553
うん、そこは影響しないように頑張るならこうだという意図で書いた
スタートアップがどうやって両方に対応するのかに対する疑問を提起するために

559 名前:デフォルトの名無しさん :2006/05/14(日) 05:11:50
>>558
ん?スタートアップは両方に対応する必要はないでしょ?

560 名前:デフォルトの名無しさん :2006/05/14(日) 05:12:38
>>558 じゃぁ >549 が不合格なのはなんで?やっぱりまだなんかあるの?

561 名前:デフォルトの名無しさん :2006/05/14(日) 05:12:55
>>559
すくなくとも int main() と int main(int, char *[]) に対応できなければならない

562 名前:デフォルトの名無しさん :2006/05/14(日) 05:14:15
>>560
結合指定が合ってるのを確認したうえで 「以上」 と言ってたならごめんよ
話についてこれてないのと見分けがついてなかった

563 名前:544 :2006/05/14(日) 05:15:48
string (s = ch);

とすることで解決出来たのですが
<string> を include しなくても使えたので
この string の扱いは basic_string で良いのでしょうか?

564 名前:デフォルトの名無しさん :2006/05/14(日) 05:16:53
日本語がおかしければ正確に伝わらないのは当然

565 名前:デフォルトの名無しさん :2006/05/14(日) 05:21:17
>>561
それ、両方 extern "C++" だから関係ないでしょ。

566 名前:デフォルトの名無しさん :2006/05/14(日) 05:27:00
extern "C++" とは?

567 名前:デフォルトの名無しさん :2006/05/14(日) 05:27:38
>>565
どちらか一方のみが extern "C" という実装もありうるし
main に結合指定を記述することも許されている
これは返却値のみについて int であることを強弁することが空疎であると主張する根拠の1つである

568 名前:デフォルトの名無しさん :2006/05/14(日) 05:27:44
>>566
extern "C" と同様に使えるが、デフォルトと同じなのであまり使わない。

569 名前:デフォルトの名無しさん :2006/05/14(日) 05:30:38
>>567
それを許可する処理系は、その定義を正しく処理する。
できなければ処理系の欠陥。処理系定義ってのはそういうことだ。

main の戻り値が int なのは規格で決まってる。
C++ で void main() が無効なのは変わらない。

570 名前:デフォルトの名無しさん :2006/05/14(日) 05:48:28
>>569
正しく処理するように画策するのは曲がった話を通すためだろうがよ
1つの関数が extern "C" と extern "C++" の両方で同じ結合を持つなんて多重定義ができずかつ複数の型で定義できる関数だけだろ?
そのために main の型が処理系定義なのは結構だが、だったら「返却値を除く」必要性こそ処理系固有の事情によるはずで
引数の渡し方や動的記憶の使い方よりも優先するほどの重要度を持つ話ではないし
それしか指摘できない者がおこがましくも回答者面してたわけだ

571 名前:デフォルトの名無しさん :2006/05/14(日) 05:51:13
関数とは名ばかりな特殊な規定の権化 >main

572 名前:デフォルトの名無しさん :2006/05/14(日) 05:51:25
>>570
規格に文句言いたいなら勝手にすればいいが、ここで同意を求めるのはやめてくれ。

573 名前:デフォルトの名無しさん :2006/05/14(日) 05:55:24
extern "C" "C++" の不一致、 gcc で試してもエラーにならんね。残念。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8680

574 名前:デフォルトの名無しさん :2006/05/14(日) 05:57:30
書籍関係のスレでぼろくそ書かれた著者か?

575 名前:デフォルトの名無しさん :2006/05/14(日) 06:05:41
>>570
英語の一文を誤訳してたやつがおこがましくも回答者面しているわけだが。

576 名前:デフォルトの名無しさん :2006/05/14(日) 06:15:10
>>572
あんたの話そらす腕は認めるよ、大したものだ
だがあいにくと文句の主たる矛先は規格ではなく 471 でな
残念だったな

577 名前:デフォルトの名無しさん :2006/05/14(日) 06:15:41
576 訂正
s/471/479/

578 名前:デフォルトの名無しさん :2006/05/14(日) 06:19:47
>>576
規格に従うつもりがあるなら、 void main() がダメなのぐらい素直に認めとけよ。

俺は >479 はまっとうな指摘だと思うけどね。
あんたがさんざん噛み付いてる main の話も、おまけでつけてるだけだし。

579 名前:デフォルトの名無しさん :2006/05/14(日) 06:19:50
持論展開したいなら。
スレ立てして、最初に自分がどういう認識なのか全て書け。
気が向いた奴が相手してくれるだろ。

580 名前:デフォルトの名無しさん :2006/05/14(日) 06:24:24
>>578
盲従はしないってだけさ
従う/従わないの2値的な考えしてる者には通じなさそうだが

ところで main に噛みついてるのは俺じゃないぜ
くだらねえつってるだけだ

581 名前:デフォルトの名無しさん :2006/05/14(日) 06:26:17
>>575
C++ についてロクな回答できない奴よりまし
なんだい、あのコードに対してヘッダに main て・・・

582 名前:デフォルトの名無しさん :2006/05/14(日) 06:32:30
OOP でございと言いながら main に固執してる奴ほど大事らしいけどな

583 名前:デフォルトの名無しさん :2006/05/14(日) 06:35:29
>>477
参照好きの漏れが修正するとこうなる。こういう関数にはもっといいパターンがあるけど、そこは気にしない方向で。
#include <iostream>

struct KATA { int ab, cd; };
int MyFunction(int x, KATA*& y) {
 y = new KATA[x];
 if (!y) return 1;

 for (int i = 0; i < x; ++i) {
  y[i].ab = 2;
  y[i].cd = 3;
 }
 return 0;
}
int main() {
 using namespace std;
 KATA* y = 0;
 cout << "MyFunctionの戻り値 = " << MyFunction(2, y) << endl;
 for (int i = 0; i < 2; ++i) {
  cout << "y[" << i << "].ab = " << y[i].ab << endl;
  cout << "y[" << i << "].cd = " << y[i].cd << endl << endl;
 }
 delete[] y;
 return 0;
}


584 名前:デフォルトの名無しさん :2006/05/14(日) 06:42:24
>>583
new の戻り値をヌルチェックしても意味無いよ。

585 名前:デフォルトの名無しさん :2006/05/14(日) 06:42:59
おっと、しまった。議論を呼ぶことをしてしまった。
> KATA* y = 0;
としていながら参照で渡しているのは酷かったな。MyFunction()のあたりに次のコメントを追記:

// 引数 KATA* への参照は、null ポインタを指している可能性がある。右辺値としてアクセスする前に、必ず代入を行うこと

586 名前:デフォルトの名無しさん :2006/05/14(日) 06:45:56
>>585
そんな些細なこと気にするぐらいだったら、「もっといいパターン」に書きかえるよな。

587 名前:デフォルトの名無しさん :2006/05/14(日) 06:48:08
bad_alloc投げてくれるんだっけ。
あー寝起きはだめすぎるなー。つっこみどころ多すぎる...orz
もう一眠りしてくる

588 名前:デフォルトの名無しさん :2006/05/14(日) 06:48:44
もう二度と起きるなw

589 名前:デフォルトの名無しさん :2006/05/14(日) 08:41:42
void mainは、
・CはC99から適合、
・C++はC++03でも駄目
ってことを知らない人がスレを混乱させてるな。


590 名前:デフォルトの名無しさん :2006/05/14(日) 09:28:21
混乱?してないだろ?

591 名前:デフォルトの名無しさん :2006/05/14(日) 11:32:18
>551
template<class T>
class SuperClass{ voif foo() { static_cast<T>(this)->submethod() };
class SubClass : public SuperClass<SubClass>{};
だな。俺は

592 名前:デフォルトの名無しさん :2006/05/14(日) 11:50:14
初心者のvoid main()にいちいち噛み付いて
age厨と100レス近く論争するのを規格を遵守するって言うんですか

593 名前:デフォルトの名無しさん :2006/05/14(日) 12:02:15
何でこんなに伸びてるんだよ

594 名前:デフォルトの名無しさん :2006/05/14(日) 12:05:30
厨房は沸点が低いから

595 名前:デフォルトの名無しさん :2006/05/14(日) 12:37:21
>>589
C99でも駄目だったと思うが。

596 名前:デフォルトの名無しさん :2006/05/14(日) 15:46:11
CreateInstance関数ってWIN32APIなんですか?
それともCOMでしか使えない関数なんですか?

597 名前:デフォルトの名無しさん :2006/05/14(日) 15:49:06
CoCreateInstanceは、COMヘルパーなWIN32API。
IClassFactory::CreateInstanceはCOMのメソッド

598 名前:デフォルトの名無しさん :2006/05/14(日) 15:49:09
>>596
少なくともC++言語に関する話題ではないな

599 名前:デフォルトの名無しさん :2006/05/14(日) 20:14:25
あの、そのあのそのごごめんなさい

600 名前:デフォルトの名無しさん :2006/05/14(日) 21:10:38
C++でEJBみたいなことがやりたいんですけど、そういったツールはありますか?

601 名前:デフォルトの名無しさん :2006/05/14(日) 21:29:34
低級の質問です(・ω・`
半径を入力すると円の面積と円周を出すプログラムを作りたいんですが

\include<iostream>
using namespace std;
double main()
{const double pi = 3.14;
double hankei;

cout << "円の面積と演習を求めます。" <<'\n';
cout <<"半径を入力してください:
cin >> hankei;
cout << "円の面積は" << hankei*hankei*pi << "です。" <<'\n';
cout << "演習は << 2*pi*hankei << "です。" ; <<'\n';

return 0;
}

このようにしたら
エスケープシーケンスの使い方が正しくありません
';' が '<' の前にありません。
型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
'cout' : 定義されていない識別子です。
定数が 2 行目に続いています。
';' が、識別子 'cin' の前に必要です。
'0x3000': この文字を識別子で使用することはできません

というエラーが出ました。「:」が「<」の前にないだのと良く分からないのですが何が問題なのでしょうか?

602 名前:デフォルトの名無しさん :2006/05/14(日) 21:35:36
とりあえず色々間違っているのはわかるが
コピペミスなのかもしれない
\include
double main
"半径を入力してください:



603 名前:デフォルトの名無しさん :2006/05/14(日) 21:36:22
\include<iostream>
double main()
cout <<"半径を入力してください:
cout << "演習は << 2*pi*hankei << "です。" ; <<'\n';
ここまでバカなんだったらムリしてプログラムなんてするなよ

604 名前:デフォルトの名無しさん :2006/05/14(日) 21:56:45


#include<iostream>
using namespace std;

int main()
{
const double pi = 3.14;
double hankei;

cout << "円の面積と演習を求めます。\n";
cout << "半径を入力してください:\n";
cin >> hankei;
cout << "円の面積は" << hankei*hankei*pi << "です。\n";
cout << "演習は" << 2*pi*hankei << "です。\n";

return 0;
}

これでも駄目なんですが何がいけないんでしょう?

605 名前:デフォルトの名無しさん :2006/05/14(日) 22:08:48
それだとどう駄目なの?

エラーが変わってないなら変わってないと、
変わったなら新たなエラーの内容くらい書けよ・・・回答者に言語以外の頭を回させるな。

606 名前:デフォルトの名無しさん :2006/05/14(日) 22:10:21
>>604

> cout << "半径を入力してください:\n";
> cout << "円の面積は" << hankei*hankei*pi << "です。\n";

全角スペースになってるぞ

607 名前:デフォルトの名無しさん :2006/05/14(日) 22:10:42
>>604
そのソースをプリントアウトしたものを見ながら
新しい main.cpp ファイルに打ち直してみましょう。
それでコンパイルできたら、なぜコンパイルできるようになったのか考えながら首吊りませう

608 名前:デフォルトの名無しさん :2006/05/14(日) 22:13:03
>>604
(´ω`)何だかナツカシす

609 名前:デフォルトの名無しさん :2006/05/14(日) 22:16:09
そもそもs/演習/円周/だと思うのだが。

610 名前:デフォルトの名無しさん :2006/05/14(日) 22:16:53
>>601>>604
初心者スレに行けよ。

611 名前:デフォルトの名無しさん :2006/05/14(日) 22:18:44
>>610
どうでもいいが
初心者で検索すると将棋スレになってワロタwww

612 名前:デフォルトの名無しさん :2006/05/14(日) 22:35:26
>>611
???

613 名前:デフォルトの名無しさん :2006/05/14(日) 23:44:00
C++はvoid *禁止ですよね?
そうすると型を無視したポインタの配列確保するときはどうすればいいのでしょうか?

Intやcharや他の構造体がいっぱい入ってくる場合どのように書けばいいのでしょうか

614 名前:デフォルトの名無しさん :2006/05/14(日) 23:48:57
>>613
別に禁止じゃないが。推奨すべき理由もないが、それが最良と判断したのなら躊躇わずに使えばいい。

615 名前:デフォルトの名無しさん :2006/05/14(日) 23:51:55
>>613
べつに禁止されてないので型を無視したいのなら使えばいいっしょ
型を無視せずにいろんな型を突っ込むなら
RTTIでdynamic_cast使ったりとか仮想関数とか適当に

616 名前:デフォルトの名無しさん :2006/05/15(月) 00:07:33
グローバルな new のオーバーロードをしていて、
処理の中では malloc でメモリ確保しているのですが
どうやれば new と同じようにコンストラクタを呼び出せるのでしょうか?

617 名前:デフォルトの名無しさん :2006/05/15(月) 00:07:41
>>613
プログラマにリスキーな手段を採る裁量を認めているのがC++の思想。

618 名前:デフォルトの名無しさん :2006/05/15(月) 00:08:16
>>616
placement newすればいいんでね

619 名前:デフォルトの名無しさん :2006/05/15(月) 00:09:52
>>616
確か勝手によばれるだろ?
明示的に呼び出したい場合は

char hoge[sizeof(hoge_type)];
new (hoge) hoge_type();

こんな感じで呼び出せる。

620 名前:デフォルトの名無しさん :2006/05/15(月) 00:11:48
>616
オーバーロードできるのはoperator newであって、newはそもそもオーバーロードできない。

621 名前:デフォルトの名無しさん :2006/05/15(月) 00:13:37
そうですかどうもありがとうございました。
Cのインターフェイスがvoid **になっていて果てさて
どうしたものかと悩んでしまいました。教えていただきありがとうございました。

622 名前:デフォルトの名無しさん :2006/05/15(月) 00:16:47
>>616
D&Eを嫁…といいたいとこだが、
Hoge *h = new Hoge();
というコードが実行される際の動作は、

1.sizeof(Hoge)のメモリがoperator newによって確保される
2.Hogeのコンストラクタが実行される

operator newはあくまでメモリを確保する役割しか持ってない。
あとは>>619-620

623 名前:デフォルトの名無しさん :2006/05/15(月) 00:18:11
>>618
>>619
>>620
ありがとうございます。

624 名前:デフォルトの名無しさん :2006/05/15(月) 10:53:16
void foo(){
  static int a=0;
  a++;
  if(a==5)return;
  foo();
}

みたいなコードを書いたとき、aは再帰で呼び出すたびに0になるの?それとも一番呼び出し元の最初だけ?

625 名前:デフォルトの名無しさん :2006/05/15(月) 10:56:28
>>624 最初だけ。

626 名前:デフォルトの名無しさん :2006/05/15(月) 10:59:06
即レスサンクス

やっと謎がとけた

627 名前:デフォルトの名無しさん :2006/05/15(月) 15:54:28
virtualなメンバー関数は非仮想関数でオーバーロード禁止なのでしょうか?

class B
{
public:
virtual void F();
};

class D :public B
{
virtual void F();//これではなく、
void F( int );//このようなもの。
}

628 名前:デフォルトの名無しさん :2006/05/15(月) 16:08:42
>>627
いえ


629 名前:デフォルトの名無しさん :2006/05/15(月) 16:54:27
いえ〜い

630 名前:627 :2006/05/15(月) 18:43:13
C++標準的コーディング技法って本を読んで、
そこに
「オーバーロードを悪いコードとして目立たせている理由に、1つは仮想関数をオーバーロードすることが望ましくないこと」
と書いてあったので気になったのですが・・

631 名前:デフォルトの名無しさん :2006/05/15(月) 18:46:23
禁止ではあるが、望ましくはない。
それだけの話。

632 名前:デフォルトの名無しさん :2006/05/15(月) 18:47:18
間違えた。

 禁止ではないが、望ましくはない。

だ。

633 名前:デフォルトの名無しさん :2006/05/15(月) 19:00:05
紛らわしいから止めとけ、ってだけのはなし

634 名前:デフォルトの名無しさん :2006/05/15(月) 19:38:56
ぁぁ。別に禁じ手ってわけじゃないんですね。安心しました

635 名前:デフォルトの名無しさん :2006/05/15(月) 19:41:09
禁じ手・・・かもしれないな。

636 名前:デフォルトの名無しさん :2006/05/15(月) 20:04:22
個人でプログラム書いてて、絶対に他人が見ないならいいけど
他人と共有するときにそんなコード書いたら、「ああ、この程度か」って思われると思うよ。
少なくともEffectiveC++は読んでないなと。


637 名前:デフォルトの名無しさん :2006/05/15(月) 20:08:12
effectiveC++に仮想関数はオーバーロードするなってありましたっけ?

638 名前:デフォルトの名無しさん :2006/05/15(月) 20:10:12
連続すいません。
こんな安易な発想で実際にクラス書かないですけど、
>>627のを
class D :public B
{
virtual void F();
virtual void F( int );
};

なら別に紛らわしくない?

639 名前:デフォルトの名無しさん :2006/05/15(月) 20:12:57
横からすいません、
なぜ仮想関数をオーバーロードしてはいけないのか
なぜオーバーロードさせたくない関数にvirtualを付けるのか
解説または、そのような記述のあるサイトがありましたら
教えて頂けるとうれしいです。

640 名前:デフォルトの名無しさん :2006/05/15(月) 20:13:31
>>638
B にもあるなら紛らわしくない。

641 名前:デフォルトの名無しさん :2006/05/15(月) 20:28:48
片方は B からの仮想関数で、
もう片方は D からの(仮想)関数となると、
紛らわしい。
まあそんだけ。

642 名前:デフォルトの名無しさん :2006/05/15(月) 20:40:15
>>637
第38項「継承したデフォルトパラメータを再定義してはならない」というのならあるね。

643 名前:デフォルトの名無しさん :2006/05/15(月) 20:48:12
それはちょっと違うなぁ。

644 名前:デフォルトの名無しさん :2006/05/15(月) 22:16:50
>>637
Effective3版の33項(2版だと9項?)には、
「基底クラスのオーバーロードした関数が隠蔽される」って話があるけど、
するなとは書いてないから違うかな?
個人的にはとてもわかりにくい仕様だと思った。

645 名前:デフォルトの名無しさん :2006/05/16(火) 00:55:51
>627
C++ STANDARDにこんなのあった。
10.3.3
[Note: a virtual member function does not have to be visible to be overridden, for example,
struct B {
virtual void f();
};
struct D : B {
void f(int);
};
struct D2 : D {
void f();
};
the function f(int) in class D hides the virtual function f() in its base class B; D::f(int)
is not a virtual function. However, f() declared in class D2 has the same name and the
 same parameter list as B::f(), and therefore is a virtual function that overrides the
function B::f() even though B::f() is not visible in class D2. ]

可視性の観点からややこしいことになるみたいね。


646 名前:デフォルトの名無しさん :2006/05/16(火) 02:23:50
>>639
オーバーロードとオーバーライドがごっちゃになってるだろ。

647 名前:デフォルトの名無しさん :2006/05/16(火) 02:27:19
>>639
そりゃあんたやw

648 名前:デフォルトの名無しさん :2006/05/16(火) 02:28:29
>>646だったorz

649 名前:デフォルトの名無しさん :2006/05/16(火) 02:39:58
ごっちゃにでもなってなけりゃ、これの意味がわからない。
> なぜオーバーロードさせたくない関数にvirtualを付けるのか

650 名前:デフォルトの名無しさん :2006/05/16(火) 02:40:08
>>639
仮想関数は関係ない。これは継承を挟んだオーバライドの問題。

親クラス(またそれ以上の先祖クラス)のメンバ関数と偶然名前が衝突した時、
子クラスのメンバ関数を呼んだつもりが、親クラスのメンバ関数を呼んでいた
なんてことになるを避ける為、継承を挟んだオーバーロードは親クラスのメンバを
隠蔽する決まりになってる。親クラスのメンバを隠蔽させたくない時は using を
使って隠蔽させたくない親クラスのメンバを指定する。

651 名前:デフォルトの名無しさん :2006/05/16(火) 06:21:17
>>650
一行目の「オーバーライド」は「オーバーロード」の間違い?

652 名前:650 :2006/05/16(火) 07:21:53
>>651
そうです。orz

653 名前:デフォルトの名無しさん :2006/05/16(火) 08:57:36
usingでベースクラスのをインポートすればOKじゃない?
普通に>>627みたいなこと俺やってるけど・・・

ていうかもう9時だorz

654 名前:デフォルトの名無しさん :2006/05/17(水) 18:05:27
C++で書かれたオープンソースソフトウェアで有名なのって
どんなのがありますか?
特にFirefoxとApacheはC++ですか?

655 名前:デフォルトの名無しさん :2006/05/17(水) 18:52:22
自分でみてみりゃいいじゃん

656 名前:デフォルトの名無しさん :2006/05/17(水) 20:34:02
Apacheは主にC
FirefoxはC++

657 名前:デフォルトの名無しさん :2006/05/17(水) 23:43:47
>>654
C++ Applications
http://www.research.att.com/~bs/applications.html

658 名前:654 :2006/05/18(木) 00:45:12
>>656
thx!

>>657
very thx!

659 名前:デフォルトの名無しさん :2006/05/18(木) 00:58:48
>>658 いちばんまっとうな 655 には礼もなしか。

660 名前:デフォルトの名無しさん :2006/05/18(木) 01:24:24
>>655,659
悪かったな、市ね


661 名前:デフォルトの名無しさん :2006/05/18(木) 01:44:10
ワラタ

662 名前:デフォルトの名無しさん :2006/05/18(木) 02:07:27
//Foo.hpp
class Foo
{
public :
  //テンプレートなメンバ関数
  //これはヘッダで定義
  template <typename T>
    void f() { std::cout << typeid(T).name() << std::endl ; }

  //普通のメンバ関数
  //これはヘッダ以外の別の場所(Foo.cpp)で定義
  void g() ;
} ;

//Foo.cpp
void Foo::g() { std::cout << "Foo::g()" << std::endl ; }


//main.cpp
int main()
{
  Foo foo ;
  foo.g() ;

  foo.f(0) ;
  foo.f(0.1) ;
}

インスタンス化に必要な部分だけは、main.cppから見えているので、ちゃんとコンパイル&リンクができるのですが、
やはりこういう書き方はやめたほうがいいのでしょうか。
export ほすぃ……

663 名前:デフォルトの名無しさん :2006/05/18(木) 02:16:51
>>662
inline にしたいのでなければ、とりあえずクラス外に移したほうがいいだろうな。
いつか export がサポートされるのを夢見て、 template の定義を別ファイルにわけて

// Foo.hpp の最後に
#ifndef COMPILER_SUPPOTS_EXPORT_KEYWORD
#define export /* removed */
#include "Foo_template.cpp"
#undef export
#endif

// Foo.cpp に
#if COMPILER_SUPPOTS_EXPORT_KEYWORD
#include "Foo_template.cpp"
#endif

とかいう話は聞いたことがある。メンドクサイ上にメリットの期待値が極小。

664 名前:デフォルトの名無しさん :2006/05/18(木) 04:53:40
質問です。
namespace MyClass
{
class Exception{ Exception( Exception &E ); };
}

というクラスを作っていたんですが、Exception( Exception &E )をException( const &E )に変えたところ、
throw Exception( "〜〜〜" );
と例外を出してるクラスほとんど(全部ではない)から
Exception( class Exception &E )は未解決〜とエラーが出てしまいました。
( Exception( Exception &E )と宣言してたときにはエラーは出てない )

で、そのエラーが出たクラス内に
using namespace MyClass;
と書き加えたところでなくなりました。
namespace MyClass
{
//ここにusing namespace MyClass;と付け加えたら出なくなった。←MyClass内なのに。
void Func(){ throw Exception( "〜〜〜" ); }
}
で、さらにその後、追加したusing namespace MyClass;を削除してリビルドすると、
未解決エラーが出なくなりました。
今は正常にリンクできるのですが、後味が悪いので質問させていただきました
これはなぜなんでしょうか?

665 名前:デフォルトの名無しさん :2006/05/18(木) 05:49:03
オブジェクトファイルの更新がうまくいってなかったんじゃまいか?
例えばそのヘッダをA.cpp, B.cpp, C.cppから参照していたとして、
constに書き換えた時、何らかの理由でA.cppのみ再コンパイルされてしまったとか。

そうすると、Aのオブジェクトはconstを引数に取るコンストラクタを参照しようとするけれど、
B,Cのオブジェクトファイルは今まで通りconstのないコンストラクタを参照しようとして、未解決エラー。
で、エラーが出たクラスに変更を加えたことで、B,Cのオブジェクトファイルも更新され、正常にリンクされるようになる。
(加えた修正には意味がなく、修正を加えたことで更新されたのが解決の原因)

VC++のようなIDEを使っていればまず起きえない問題だけど、
もしMakefileでコンパイルを制御しているなら、各オブジェクトがヘッダの更新に対応しているかどうか
依存関係の記述を見直してみるといいかと。

666 名前:655 :2006/05/18(木) 08:41:45
>>660
俺もワロタ

667 名前:デフォルトの名無しさん :2006/05/18(木) 16:29:33
ところでBjarneはカタカナ表記だとビョーンでいいのかな?

668 名前:デフォルトの名無しさん :2006/05/18(木) 16:59:47
ビョーン・ソレ・シランカットッテンチントンシャン

669 名前:デフォルトの名無しさん :2006/05/18(木) 17:35:34
>>667
FAQの最初にあるのも笑えるが。
ttp://www.research.att.com/~bs/bs_faq.html#pronounce

自分の脳内では、ビャーネ・ストロォストルップなんだが

670 名前:664 :2006/05/18(木) 18:28:56
>>665
返信ありがとうございます。
実はVC++使ってます(汗・・・

671 名前:デフォルトの名無しさん :2006/05/18(木) 19:34:34
>>668
細野ー!

672 名前:デフォルトの名無しさん :2006/05/18(木) 21:02:10
>>667
ハゲ

673 名前:デフォルトの名無しさん :2006/05/18(木) 23:56:43
やっと正解が出たか

674 名前:デフォルトの名無しさん :2006/05/19(金) 00:09:48
某氏がブジャーナ ストラウストラップって書いてたから
影響されて俺もそういってるけど、検索しても全然でてこねえな

675 名前:デフォルトの名無しさん :2006/05/19(金) 00:20:04
とりあえずWikiにはこう載ってる。URL長杉。
ttp://ja.wikipedia.org/wiki/%E3%83%93%E3%83%A3%E3%83%BC%E3%83%8D%E3%83%BB%E3%82%B9%E3%83%88%E3%83%AD%E3%83%B4%E3%82%B9%E3%83%88%E3%83%AB%E3%83%83%E3%83%97


676 名前:デフォルトの名無しさん :2006/05/19(金) 01:11:51
とっさに発音できないからハゲでいいや。

677 名前:デフォルトの名無しさん :2006/05/19(金) 01:13:01
とっさに発音することなんてあるのかよ

678 名前:デフォルトの名無しさん :2006/05/19(金) 01:38:02
道ばたで出くわした時
「やあ、禿」なんて言うわけにいかないだろ

679 名前:デフォルトの名無しさん :2006/05/19(金) 01:44:42
やあ、禿、C++0xにevalを導入する件、よろしく頼むよ。

680 名前:デフォルトの名無しさん :2006/05/19(金) 15:57:48
や、友達にC++のことを話すとき
「ビャールネ・ストロヴストルップ氏が〜〜って書いてた。」
って言うよりは、
「ハゲが〜って書いてた。」
って言うほうが早いなと。


681 名前:デフォルトの名無しさん :2006/05/19(金) 16:01:38
>>680
あんまりそんな事言ってると自分が偉くなって氏に直接会う機会とかで「ハゲ」って言いかねないからなぁ。

習慣って怖いし、「ハゲ」とか言ってると上司ににらまれたりもするし(w


682 名前:デフォルトの名無しさん :2006/05/19(金) 16:28:23
>>681
前者 → ないないw
後者 → …もの凄い気まずかったが、何か?

683 名前:デフォルトの名無しさん :2006/05/19(金) 19:13:57
STLに的を絞って勉強しようと本を探しているのですが、何かおすすめはないでしょうか

できれば、必要な知識の解説&リファレンスが3:7ぐらいの割合で入っているものが欲しいです

684 名前:デフォルトの名無しさん :2006/05/19(金) 19:19:28
>>683
ttp://www005.upp.so-net.ne.jp/episteme/html/stlprog/index.html

685 名前:デフォルトの名無しさん :2006/05/19(金) 19:45:36
>>683
解説:EffectiveSTL
リファレンス:>684のサイト
詳細情報:適当な実装

686 名前:デフォルトの名無しさん :2006/05/19(金) 19:49:27
STLPortがいいんじゃね

687 名前:デフォルトの名無しさん :2006/05/19(金) 22:35:02
>>683
Apacheのstdcxxリファレンスもお勧め。

ttp://incubator.apache.org/stdcxx/

688 名前:デフォルトの名無しさん :2006/05/20(土) 19:13:38
WinXPでコンパイラはVisual C++ 4.0を使っているのですが

#include <iostream>

int main()
{
  std::cout << "wake waka ran";
}

をコンパイルするとエラーがでます。
1.インクルードファイルがオープンできないといわれるから,
<iostream.h>にすると
2.戻り値が指定されていないといわれる。
だから return 0;をつける。
けれど
3.std識別子がクラス名ではないときます・・
なにが原因なのでしょうか

689 名前:デフォルトの名無しさん :2006/05/20(土) 19:15:03
きついのが来たな...

690 名前:デフォルトの名無しさん :2006/05/20(土) 19:18:22
>>688
<iostream>と<iostream.h>の違いはstd名前空間に入っているかいないか
(iostream.hはとっくにdeprecatedだけれど)
だからiostream.hにするならstd::をつける必要はない
というかVC4.0を使うぐらいならVC2005EEにした方が数百倍マシな気がするが…

691 名前:デフォルトの名無しさん :2006/05/20(土) 19:28:50
std::をけして<iostream.h>にしたら問題なくコンパイルできました。

コンパイラですが,VC2005EEは使ったけれど使いにくかった(使い慣れていない)ので,アンインストしましたが,
そうならもう一度入れてVC2005EEを使用することにします。

ありがとうございました。

692 名前:デフォルトの名無しさん :2006/05/20(土) 19:54:06
>>688
基本的なことだが、C++ の規格票に書いてある
        制定年度
          ↓
ISO/IEC14882:xxxx

と、VC4 の出荷時期を比べてみるといい

あの当時の事実上の標準はこれ
http://www.research.att.com/~bs/arm.html

693 名前:デフォルトの名無しさん :2006/05/20(土) 19:56:09
しかもその事実上の標準にも適合してないし。

694 名前:デフォルトの名無しさん :2006/05/20(土) 19:58:42
VC2005はなんか使いにくいというか、重くて、UIの色使い(?)に
抵抗感があるよね・・・
一生VC2003と付き合っていくことになりそうだ

695 名前:デフォルトの名無しさん :2006/05/20(土) 20:01:02
>>694
俺もVC2003から乗り換えた当初は「なんだこの分かりづらくてケバい色遣いは」と思ったが
しばらく使ってると慣れて、むしろ見やすく感じるようになった。
住めば都とはこのことか。

696 名前:デフォルトの名無しさん :2006/05/20(土) 20:16:01
コンパイラだけ入れ替えてくれ。

697 名前:デフォルトの名無しさん :2006/05/20(土) 21:35:06
2003も2005も、キーボードだけでクラスの頭出しが出来ないから
一生VC6と付き合っていくことに……なるのは嫌だな。なんで退化するのよ。

698 名前:デフォルトの名無しさん :2006/05/20(土) 22:19:49
何を言ってるかわからんがインテリセンス?
まぁいずれにせよスレ違いということで

699 名前:デフォルトの名無しさん :2006/05/20(土) 22:31:25
いやインテリセンスじゃなくて、そこに飛ぶの。もの凄い便利よ。良く皆あれ無しでやっていけるなと思う。まぁスレ違いか。

700 名前:デフォルトの名無しさん :2006/05/20(土) 22:42:55
>>699
右クリック→Go to definition じゃダメなの?
右クリックはコンテキストメニューキー、Go to definitionはGキーで代用できるから、
実質2回キーを押すだけで飛べるんだが、それじゃ不満なのかね。
別にマクロ組んでショートカット割り当てても同じだと思うが…

というかスレ違いだな、うん。

701 名前:デフォルトの名無しさん :2006/05/20(土) 22:47:47
>>700
レスしてーw
違う、違うんだ!でもスレ違いだw

702 名前:デフォルトの名無しさん :2006/05/20(土) 22:55:09
VC++2005にはマクロ機能が無い!!!。これ最悪。

スレ違いでごめん。

703 名前:デフォルトの名無しさん :2006/05/20(土) 23:15:54
>>701
気になるじゃまいか

704 名前:デフォルトの名無しさん :2006/05/21(日) 00:44:20
オーバーロードに関して質問です。
void f(int) {}
void f(float) {}
template<class T> void g(T) {}
g(f); // 曖昧
これを g(なんとか); の呼び出しで解決する方法はありますか?

705 名前:デフォルトの名無しさん :2006/05/21(日) 00:45:12
>>704
g(f<int>);とg(f<float>);でできたような。違ったらすまん。

706 名前:デフォルトの名無しさん :2006/05/21(日) 00:47:10
>>705
f()はテンプレート関数じゃないように見えるんだが……。

どうやるんだろう。

707 名前:デフォルトの名無しさん :2006/05/21(日) 00:47:20
>>704 static_cast

708 名前:705 :2006/05/21(日) 00:49:12
>>706
これはおおぼけをかましてしまった。
_| ̄|○

709 名前:デフォルトの名無しさん :2006/05/21(日) 00:52:25
>>707
通りました。
一応確認ですが
g(static_cast<void (*)(float)>(f));
でvoid f(int); が void f(float)にキャストされてしまう心配は無いですか?

710 名前:デフォルトの名無しさん :2006/05/21(日) 00:54:28
>>709
そんな無茶な変換をstatic_castが通すわけがない。

711 名前:デフォルトの名無しさん :2006/05/21(日) 00:56:24
>g(f); // 曖昧

曖昧なのは本当はコンパイラのチェックのタイミングで
PG の設計じゃないのにな

712 名前:デフォルトの名無しさん :2006/05/21(日) 00:56:50
>>704
g<void (int)>(f);なんかはだめ?
static_castよりも少ない文字数だよ。

713 名前:デフォルトの名無しさん :2006/05/21(日) 01:04:13
>>710
ありがとう御座います。
密かに
void (*p)(float) = f;
g(p);
しか無いのかなと思っておりました。

>>711
趣味でやっているもんでして

>>712
上の例はかなり簡略した例でして
実際のはfor_eachに渡すんで第二引数になってしまうんですよね。
第一引数を指定するのも面倒なんで>>707の方法で逝きます。
ありがとうございました

714 名前:デフォルトの名無しさん :2006/05/21(日) 01:05:42
しかし、オーバーロードの利点がなくなりそうなコードだが……。

715 名前:デフォルトの名無しさん :2006/05/21(日) 01:11:29
>>714
確かにそうなんですが destroy_int とか destroy_float ってやるのもどうかと思いまして。。。
当然中身はただ delete オペレータ読んでるだけじゃないっす。float 以外の型も増えそうな感じなんで。

716 名前:デフォルトの名無しさん :2006/05/21(日) 01:26:12
テンプレートで出来ないのかと思ってやってみたけど、無理なのか……。
古き良きマクロでも使うしかないのかねぇ……。

template <typename T>
void (T) make_f()
{ return static_cast< void (T)>(f) ; }

template <typename T>
void (*)(T) make_f()
{ return static_cast< void (*)(T)>(&f) ; }

template <typename T>
struct make_f
{
  typedef ????……無理か……
}

717 名前:デフォルトの名無しさん :2006/05/21(日) 01:26:41

具体的な用途は知らんけど、こんな感じにしたら?

#include<iostream>
using namespace std;
template<typename T> struct g_impl;
template<> struct g_impl<int> {static int do_it(){cout << "int" << endl;} };
template<> struct g_impl<float> {static int do_it(){cout << "float" << endl;}};

template<class T> void g(T) {g_impl<T>::do_it();}

int main()
{
g(5);
g(5.5f);
}

718 名前:デフォルトの名無しさん :2006/05/21(日) 01:28:46
>>717
for_eachに渡したいといっているんだから、
関数オブジェクトにすべきでは?

719 名前:デフォルトの名無しさん :2006/05/21(日) 01:33:30
既に g(なんとか); の呼び出しで解決してないのでありますが…

720 名前:デフォルトの名無しさん :2006/05/21(日) 01:38:10
汎用関数に,オーバーロードされた関数へのコールバックを
明示的なキャストなしで引き渡したい場合,確かに
(operator()がオーバーロード/テンプレート化された)関数オブジェクトにするしか
方法がないとは思いますけれど,そうすると今度は関数オブジェクトを
わざわざ作る手間とのトレードオフになってしまうんですよね.

721 名前:デフォルトの名無しさん :2006/05/21(日) 01:42:51
template <typename T> struct destroy ;

template <> struct destroy<int>
{
  void operator () (int *p){ delete p ; }
} ;
template <> struct destroy<float>
{
  void operator () (float *p){ delete p ; }
} ;



int main()
{
  int * ptr_array[32] ; //

  for (int i = 0; i != 32 ; ++i)
    ptr_array[i] = new int ;

  std::for_each( &ptr_array[0], &ptr_array[32], destroy<int>() ) ;

}

そんなに手間かな?
むしろ関数オブジェクトのほうが使いやすいと思うのだが。


722 名前:721 :2006/05/21(日) 01:49:39
じつは特殊化を使う必要もなかったり……

723 名前:デフォルトの名無しさん :2006/05/21(日) 01:51:55
C++の厄介なところはあれでも出来るこれでも出来るって所に有りまして・・・
趣味でやってると時間の制限が無い分、あれこれ試してるだけで1日終わったり…。
今はなるべく、行数が少ない方が良いと思ってプログラムしております。
変更するのに時間掛からないんで。
どうでもいいですよね

724 名前:デフォルトの名無しさん :2006/05/21(日) 01:54:20
>>721
>>722
関数オブジェクトクラスに型パラメータを持たせずに
済ませることすらできるようになりますね.

struct destroy{
template< class T > operator()( T *p ){ delete p; }
};

ただ for_each のような例なら関数呼び出し構文の戻り値の型を
全く必要としないのでその手間で済むんですが,一般には汎用関数内で
戻り値の型を必要とする場合がしばしばあるので,
そうすると戻り値の型計算をちゃんと書かないといけなくなるので.
(いわゆる Polymorphic Function Object)

725 名前:721 :2006/05/21(日) 01:56:22
template <typename T> struct destroy
{
  void operator() (T *p) { delete p ; }
} ;

オーバーヘッドが気にならないんだったら、
boostのsmart_ptrあたりをコンテナに放り込んだほうが楽そう。

>>723
禿曰く、「マルチパラダイム」らしいけど。

726 名前:721 :2006/05/21(日) 01:57:49
>>724
それは思いつかなかった。
自分はまだ未熟かOrz

727 名前:デフォルトの名無しさん :2006/05/21(日) 02:45:48
うは、トラックバックしてぇ

728 名前:デフォルトの名無しさん :2006/05/21(日) 02:48:04
Effective STLに載っていたような気がする。


729 名前:デフォルトの名無しさん :2006/05/21(日) 03:18:40
>>704
         ,. -‐'''''""¨¨¨ヽ
         (.___,,,... -ァァフ|          あ…ありのまま 今 起こった事を話すぜ!
          |i i|    }! }} //|
         |l、{   j} /,,ィ//|       『関数ポインタを返す関数をコンパイラに読ませたと
        i|:!ヾ、_ノ/ u {:}//ヘ        思ったらいつのまにか自分では読めないコードがそこにあった』
        |リ u' }  ,ノ _,!V,ハ |
       /´fト、_{ル{,ィ'eラ , タ人        な… 何を言ってるのか わからねーと思うが
     /'   ヾ|宀| {´,)⌒`/ |<ヽトiゝ        おれも何をしたのかわからなかった…
    ,゙  / )ヽ iLレ  u' | | ヾlトハ〉
     |/_/  ハ !ニ⊇ '/:}  V:::::ヽ        頭がどうにかなりそうだった…
    // 二二二7'T'' /u' __ /:::::::/`ヽ
   /'´r -―一ァ‐゙T´ '"´ /::::/-‐  \    催眠術だとか超スピードだとか
   / //   广¨´  /'   /:::::/´ ̄`ヽ ⌒ヽ    そんなチャチなもんじゃあ 断じてねえ
  ノ ' /  ノ:::::`ー-、___/::::://       ヽ  }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::...       イ  もっと恐ろしいものの片鱗を味わったぜ…

template<typename T>
inline void (*select_f())(T) { return f; }

g(select_f<int>());

730 名前:デフォルトの名無しさん :2006/05/21(日) 06:06:45
http://java.sys-con.com/read/45250.htm?CFID=284001&CFTOKEN=8D1F3492-114D-12D2-748B749EEAB77345

731 名前:デフォルトの名無しさん :2006/05/21(日) 07:44:42
>>724をそのまま使うのだったらboost::checked_deleteを使えば良いと思う。

732 名前:デフォルトの名無しさん :2006/05/21(日) 14:58:09
>>729
こういう風に調べたのだろうか……。

//関数ポインタ
typedef void (*ptr_type)(int) ;

//関数ポインタを返す関数
ptr_type foo() ;

//人間の読める文字列を得る。
std::cout << typeid(foo).name() << std::endl ;

//VC7.1だと、void (__cdecl*__cdecl(void))(int)
これを元にテンプレート関数へ
template <typename T>
inline
void ( *make_f(void) ) (T) { retuirn f ; }

将来、絶対に書きたくないし読みたくもないコードだ……。

733 名前:デフォルトの名無しさん :2006/05/21(日) 18:24:15
>>732
ふつーに K&R でも読めばどうとでも・・・

734 名前:デフォルトの名無しさん :2006/05/21(日) 19:27:31
K&R吹いた

735 名前:デフォルトの名無しさん :2006/05/21(日) 20:09:03
>>729
typedef しろ

736 名前:デフォルトの名無しさん :2006/05/21(日) 20:30:05
>>735
あれを typedef 使って書き直そうとすると、 template のせいで意外と大変な罠。

737 名前:デフォルトの名無しさん :2006/05/21(日) 20:43:04
脊髄反射してしまった。スマン。

738 名前:デフォルトの名無しさん :2006/05/21(日) 20:58:36
>>734
関数ポインタを返す関数について K&R と C++ の相違を述べよ

739 名前:デフォルトの名無しさん :2006/05/21(日) 21:11:17
K&R C との比較か?

740 名前:デフォルトの名無しさん :2006/05/21(日) 21:15:49
>>738
違いはない。一人吹いたぐらいで突っかかるな。

741 名前:デフォルトの名無しさん :2006/05/21(日) 21:57:51
「違い」 と、わざと曖昧な聞き方をしてみたが
返ってきたのは 739 程度

742 名前:デフォルトの名無しさん :2006/05/21(日) 21:59:22
変な煽りあいは他所でやってくれ。

743 名前:デフォルトの名無しさん :2006/05/21(日) 22:00:51
じゃ、おまえは二度と煽るなよ

744 名前:デフォルトの名無しさん :2006/05/21(日) 22:39:11
はあ?何でだよwww意味不明すぎww
論理的思考のできない平成生まれが脊椎反射でレスてんじゃねーよwwww

745 名前:デフォルトの名無しさん :2006/05/21(日) 22:50:07
脊髄による反射でレスできるならしてみろドアホ

746 名前:デフォルトの名無しさん :2006/05/21(日) 22:56:02
カックン

747 名前:デフォルトの名無しさん :2006/05/21(日) 22:56:36
カックン

748 名前:デフォルトの名無しさん :2006/05/21(日) 23:04:35
>>738
C++にしかないtemplateと併用する場合typedefを使うとかえって面倒なため(>736)、
>729のような複雑な宣言を強いられるが、
Cであればtypedefですっきりした宣言にできる。
あんたはCでもtypedefせずに>729みたいに書いてるのか?

つかまさかK&Rに>729みたいな書き方を読めるようになりなさいって書いてあるんだろうか

749 名前:デフォルトの名無しさん :2006/05/21(日) 23:08:39
>あんたはCでもtypedefせずに>729みたいに書いてるのか?

まあ、そうだね
職場でもスタイルについては頻繁に議論するけど
これに不満を訴える人はいないし

750 名前:デフォルトの名無しさん :2006/05/21(日) 23:12:07
他所でやってもらえませんでしょうか?


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.