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


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

C++相談室 part43
501 名前:487 :2005/09/13(火) 21:23:20
>>488
一時変数の束縛は、それが参照されとぃるかどうかではなく、
あくまでその一時変数を含む式の最後まで保持されるに過ぎない、
ということを確認したかったのですが、規格書の 12.2-3 に
書いてありました。
規格書には「full-expression を評価した最後まで」みたいな表記
だったので、full-expression ってどこまでじゃーと思ってさらに
検索したら 1.9-12 に「別の expression の subexpression でない
ものが full-expression」とかあって何だか騙されたような気分に。

とりあえず関数呼び出しは expression なんで、一時オブジェクト
を使って関数呼び出しを何度行おうが、それが一つの式である限り
一時オブジェクトは有効、ということですね。一番最後の例は最初
の文の後で A() は破棄されてしまうのでダメ、と。

502 名前:デフォルトの名無しさん :2005/09/13(火) 21:27:42
>>499
ios::sync_with_stdio() は呼んでますよね

503 名前:デフォルトの名無しさん :2005/09/13(火) 21:33:44
>>500
> ・gets()は過去との互換性が必要な場合を除いて使うべきではない。
調べていたらバッファオーバーフローの原因になるので使わないようにと
いろんなサイトに書いてました・・・・。
fgets() というのを使うようにします。

> ・NULLは入るはずがない。NULキャラなら勿論入るが。
すみません。まだまだよくわかってないんですが、
自分でも何が言いたかったのかよくわかんないんですが
文字が入ってない状態ってことを言いたかったんです。
ヌル文字は入りますね。

> ・>>499に書かれたロジック以前に入力は行なっていないか? その場合空読みするべき。
>>499 のコード以前に cin で入力させていました。
これを消してやってみたら、問題なく動きました。
どういう動きをしてこういうことになるのかとか
細かいことはまだまだよくわからないんですが
これから勉強続けていけばわかってくるかなということで
今回はこれでよしとします。

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

504 名前:デフォルトの名無しさん :2005/09/13(火) 21:47:22
>>502
すみません、呼んでません。
っていうか全然わかりません。

翔泳社の標準講座C++で勉強してるんですが
640ページ近くあるうちのまだ145ページぐらいしか読めてないので
難しいことはまだ全然わかりません。

でもちょっと調べてみます。
ありがとうございました。

505 名前:デフォルトの名無しさん :2005/09/13(火) 22:38:12
>>504
ストリームバッファとstdioが別々の実装になっていても、常に中身を同じく
するのがstd::ios::sync_with_stdio(bool b = true)。

但し、デフォルトで最初からtrueなので、今回の件とは関係ないと思う。

506 名前:デフォルトの名無しさん :2005/09/13(火) 23:05:45
>>503
一般的に、 std::cout が問題なく使える環境なら
iostream と cstdio は混ぜる必要が無い。(混ぜないほうがいい)
さらに言えば、文字列操作も std::string を使ってしまえばいい。
今回の例で行くと、 s1 に40文字、 s2 に40文字入力された場合、
strcat() で配列サイズ超えた書き込みが起こってしまう。

string s1, s2;
cout << "Enter two strings : ";
cin >> s1;
cin >> s2;
s1 += s2; // or s1.append(s2);
cout << s1 << "\n";

これでバッファオーバーフローも配列オーバーも起こり得ない。

ただし cin >> s1 はDOS攻撃を許してしまう
セキュリティホールだと捉える場合もある。
istream::getline() などを使うといい。

507 名前:デフォルトの名無しさん :2005/09/13(火) 23:08:36
>>501
はい。その理解で問題ないですよ。

あとはこんな話とか。
http://jbbs.livedoor.jp/bbs/read.cgi/computer/5651/1075539833/35

508 名前:デフォルトの名無しさん :2005/09/14(水) 01:35:28
ポインタについて質問させて下さい。

以下の2つの宣言は、同じ意味を持ちますか?

CPen* Pen1;
CPen *Pen2;

基本的なことの質問ですが、回答お願いいたします。

509 名前:デフォルトの名無しさん :2005/09/14(水) 01:39:39
前者はCPen*型の変数Pen1を宣言している
前者はCPen*型の変数Pen2を宣言している

質問の意図を察するに同じ意味でオッケー。

510 名前:デフォルトの名無しさん :2005/09/14(水) 01:41:24
>>508
上の宣言はC++コンパイラを使うように指示する
下の宣言はCコンパイラを使うように指示する

511 名前:デフォルトの名無しさん :2005/09/14(水) 01:56:52
>>510 おもしろくない

512 名前:デフォルトの名無しさん :2005/09/14(水) 01:57:37
えーっ!そうなのか!!知らなかったよ。
んじゃ CPen * Pen3; はどうなるの?教えてちょぶだい。

513 名前:デフォルトの名無しさん :2005/09/14(水) 02:04:30
C#コンパイラかな、やっぱり。

514 名前:デフォルトの名無しさん :2005/09/14(水) 02:27:39
CPen * * Pen4, *pen5; は?

515 名前:デフォルトの名無しさん :2005/09/14(水) 02:44:35
>>514
Cωコンパイラ

516 名前:508 :2005/09/14(水) 04:13:38
>>509
早速のレスありがとうございます。

>>510
本当のことですか?ネタですか?
マジレス、キボン

517 名前:デフォルトの名無しさん :2005/09/14(水) 04:14:57
さすがにこのレベルなら自分で調べられるだろ

518 名前:デフォルトの名無しさん :2005/09/14(水) 06:58:56
>>516

>>511以降の展開見れば察しはつくだろ。
察しがつかないなら2chを利用するのは止めとけ。

519 名前:デフォルトの名無しさん :2005/09/14(水) 07:19:56
2ch信者というやつですか。あらまあ必死 ;-)

520 名前:デフォルトの名無しさん :2005/09/14(水) 08:35:40
なぜにウィンク

521 名前:デフォルトの名無しさん :2005/09/14(水) 09:43:54
質問です。

try {
 throw (int);
} catch (int a) {
 printf("%d\n", a);
}

とした場合、
aには何が入るかは決まってますか?

522 名前:デフォルトの名無しさん :2005/09/14(水) 09:47:13
>>516
マジレスしとくよ。一応。お前思いっきり釣られてる。

523 名前:デフォルトの名無しさん :2005/09/14(水) 09:48:02
>>521
0だろ。

524 名前:デフォルトの名無しさん :2005/09/14(水) 09:50:04
>>521
お前、それコンパイル通ったか?

525 名前:デフォルトの名無しさん :2005/09/14(水) 09:51:08
>>521
コンパイルできませんよ。

526 名前:デフォルトの名無しさん :2005/09/14(水) 09:58:10
あれれ、コンパイルできませんでした。
もしかして、型だけthrowするのってできないんですか?

527 名前:デフォルトの名無しさん :2005/09/14(水) 10:01:04
>>526 やってみてから言ってるんだろうな?

528 名前:デフォルトの名無しさん :2005/09/14(水) 10:23:09
つか仮にコンパイルできて0とかが返されたところで何に使うんだか。

529 名前:デフォルトの名無しさん :2005/09/14(水) 10:27:34
throw int();

とやったら通りました。
型を返す時は暗黙的に一時オブジェクトを返すということですか?


530 名前:デフォルトの名無しさん :2005/09/14(水) 10:33:24
>>529
int()はどんな文脈でも0と同じだが。

531 名前:デフォルトの名無しさん :2005/09/14(水) 10:34:07
ちなみにaは0でした。

intの暗黙のコンストラクタは0をセットするんでしょうか。
(というかこの理解であってますか?)


532 名前:デフォルトの名無しさん :2005/09/14(水) 10:34:25
>>529
言っている意味がよく分からんが、それは throw int(0); や throw 0; と書いているのと同じ。
型を返しているのではなく、int型の値(オブジェクト。内容は0)を投げている。


533 名前:デフォルトの名無しさん :2005/09/14(水) 10:37:24
>>532
意味違ってましたか。
型だけをthrowしたいんですが、どうすればよいですか?
(どっかの解説サイトに型またはオブジェクトをthrowできるとあったので)

534 名前:デフォルトの名無しさん :2005/09/14(水) 10:42:14
>>533
それは嘘だ。 throw できるのはオブジェクトだけ。
サイト晒せ。

535 名前:デフォルトの名無しさん :2005/09/14(水) 10:45:38
>>534
そうでしたか。
すいません。
Javaのサイトだったかもしれません。
たしかgoogleで throw 例外 式 とかで検索して出てきたサイトです。

536 名前:デフォルトの名無しさん :2005/09/14(水) 10:51:49
>>535
それも嘘だ。おまえの勘違いだろ。

537 名前:デフォルトの名無しさん :2005/09/14(水) 10:53:40
見つけました。
ここです。
ttp://www.mars.dti.ne.jp/~torao/program/cpp/exception.html

>何をなげるか
>例外処理の throw では、int, char*, double, 構造体など、どんなデータ型でも投げられます。

(中略)

>また、例外はクラス定義されたオブジェクトもなげることができます。


538 名前:デフォルトの名無しさん :2005/09/14(水) 10:58:01
>>536
読み返したら、自分の勘違いだったみたいです。
型を投げるではなく、〜型のデータを投げるという文脈みたいですね。
でも、まぎらわしいですよね。

539 名前:デフォルトの名無しさん :2005/09/14(水) 11:09:42
本買えバカ

540 名前:デフォルトの名無しさん :2005/09/14(水) 11:12:47
>>537
そのサイト、筆者の知識が曖昧だな。鵜呑みにしないほうがいい。

541 名前:デフォルトの名無しさん :2005/09/14(水) 12:33:32
おいおい型を投げるって・・・・・
C++にはまだリフレクションが装備されてないぞ。これから先もずっとからかも。

542 名前:デフォルトの名無しさん :2005/09/14(水) 13:30:45
obj->Func(); は、Func が非仮想関数なら静的結合されて、通常の関数呼び出しと同じ速度で実行できる
……の認識で合ってますか?

543 名前:デフォルトの名無しさん :2005/09/14(水) 13:59:49
合ってる。
class A
{
public: void f(int n);
};
のf()呼び出しは
sturct A
{
};
void A_f(int n, A*)
;のA_f()呼び出し
と本質的に変わらん。

544 名前:デフォルトの名無しさん :2005/09/14(水) 14:05:46
thisがレジスタ渡しされるぶん前者が速いよ(VC)

545 名前:デフォルトの名無しさん :2005/09/14(水) 14:08:35
const std::string & s = "hoge";

としたとき、

(1) "hoge"で初期化された一時オブジェクトが生成される
(2) sに一時オブジェクトの参照が代入される

という認識であっていますか?
またこの場合、sの有効期間はどうなりますか?


546 名前:545 :2005/09/14(水) 14:12:41
すみません。少し前に出てた話題(>487)でした。
解決しました。

547 名前:デフォルトの名無しさん :2005/09/14(水) 14:20:01
>>543 >>544
便乗だけど、非仮想だったら
a->b->c->d->func()
でも同じことが言える?

548 名前:デフォルトの名無しさん :2005/09/14(水) 14:34:56
質問です。
newでclassの配列を生成する際、それぞれのclass生成時のコンストラクタ引数は指定できないんでしょうか?

例えば。
String *str;
str = new String [5] ("デフォ文字列");

という感じにできるのが理想です。
(Stringというのは説明のためにデッチあげたクラスです)
もちろんこれはコンパイルとおらないのですが…。


549 名前:デフォルトの名無しさん :2005/09/14(水) 14:36:52
C++の設計ミスでできない

550 名前:デフォルトの名無しさん :2005/09/14(水) 14:37:04
>>548
無理です。

551 名前:デフォルトの名無しさん :2005/09/14(水) 14:40:45
ありがとうございます。

おやまぁ…。
これは結構困り者ですね。

552 名前:デフォルトの名無しさん :2005/09/14(水) 15:03:36
>>549
設計ミスじゃないぞゴラ。

553 名前:デフォルトの名無しさん :2005/09/14(水) 15:20:09
あーん?
こんな重要な事項、設計ミス以外の何があるってんだ。言って見ろ。

554 名前:デフォルトの名無しさん :2005/09/14(水) 15:51:42
互換性

555 名前:デフォルトの名無しさん :2005/09/14(水) 16:52:12
コンストラクタ記述にCとの互換性もクソもないと思うが

556 名前:デフォルトの名無しさん :2005/09/14(水) 17:08:30
C++0xには配列のコンストラクタ記述を認める予定があるんだろ。

557 名前:デフォルトの名無しさん :2005/09/14(水) 17:51:54
実際どうなんかねえ。「C++の設計と進化」を読むと、配列型のnew/delete
演算子は後から追加されたものらしいから(§10.3、P270)、その時、初期化の
書式との整合性を取るのを”うっかり”忘れたのかねえ。

俺には何か理由があってわざと取り入れなかったような気がしてならないんだが。

558 名前:デフォルトの名無しさん :2005/09/14(水) 19:30:19
>>548
代わりにその型へのポインタをnew []して、その中に個々の要素をnewで入れたり、
あるいはstd::vectorを使って、個々の要素をpush_back()で入れていったりする。

559 名前:デフォルトの名無しさん :2005/09/14(水) 19:38:15
>>558
それやと、boost::shared_ptrか、boost::ptr_vector使わないと、deleteが
面倒やねえ。

560 名前:558 :2005/09/14(水) 19:43:18
>>559
言い方が悪かった。
std::vectorにはポインタではなく、オブジェクトそのものを入れるつもりで書いた。

561 名前:デフォルトの名無しさん :2005/09/14(水) 20:11:01
まあ配列にはstd::vectorやね。C++なら。OOする時はboost::ptr_vector当たりが便利。

562 名前:デフォルトの名無しさん :2005/09/14(水) 20:13:24
javaでもできないし良いやん

563 名前:デフォルトの名無しさん :2005/09/14(水) 20:27:48
C#が出来るのでくやしい。

564 名前:デフォルトの名無しさん :2005/09/14(水) 20:31:51
C# だと出来るんか。知らんかった

565 名前:デフォルトの名無しさん :2005/09/14(水) 20:44:48
>>564
558の前者のようなやり方になる。つまり参照をnew []して、個々の要素をnewする。
ただ初期化できるんだけどね。

566 名前:デフォルトの名無しさん :2005/09/14(水) 20:53:50
>>548
cygwin g++ なら、-ansi -Wall オプションつけても、それ通るよ。
動作も期待通り。

他の処理系のg++ は試してないからわからんけど。

567 名前:デフォルトの名無しさん :2005/09/14(水) 20:54:55
C++でワイドバイトファイルとマルチバイトファイルを両方扱わなきゃ
いけない場合、どのように実装する?
今は、BOMを見てマルチバイトだった場合は1行読み込む毎にwchar_tに変換〜てな感じでやっている。
しかし、なんか効率悪くて思えて仕方が無いんだけど・・・。

568 名前:デフォルトの名無しさん :2005/09/14(水) 20:58:04
>>566
それGCCの独自拡張だったような

569 名前:デフォルトの名無しさん :2005/09/14(水) 21:00:57
gccとbccは独自拡張多いな‥‥まあbccはObjectPascalとの互換性維持があるからしょうがないが

570 名前:デフォルトの名無しさん :2005/09/14(水) 21:43:16
gccのはもろイカ臭いよね

571 名前:デフォルトの名無しさん :2005/09/14(水) 21:45:31
gccはC99とかc++0xの規格を少し取り入れているからな。C99に関してはかなり。

572 名前:デフォルトの名無しさん :2005/09/14(水) 21:49:42
>>571
逆にgcc独自拡張がC99に取り入れられたものもある。

573 名前:508 :2005/09/14(水) 22:45:45
>>522thx (・∀・)

574 名前:デフォルトの名無しさん :2005/09/14(水) 22:46:19
>>567
読み込むファイルを全部ワイドバイトにしてしまえばいい。
で、別途コンバータを提供する。

って、そういう問題じゃないか・・・。

575 名前:デフォルトの名無しさん :2005/09/14(水) 23:35:36
ワイドバイト? 新語?

576 名前:デフォルトの名無しさん :2005/09/14(水) 23:48:02
ワイドバイト の検索結果のうち 日本語のページ 約 134 件中 1 - 50 件目 (1.04 秒)
wide-byte の検索結果 約 630 件中 1 - 50 件目 (0.40 秒)

577 名前:デフォルトの名無しさん :2005/09/15(木) 00:31:49
>>545
× sに一時オブジェクトの参照が代入される
○ sが一時オブジェクトへの参照として初期化される

578 名前:デフォルトの名無しさん :2005/09/15(木) 12:52:49
>>576
超少数派だね

579 名前:デフォルトの名無しさん :2005/09/15(木) 16:24:46
stlのmapみたいな感じで、valueからkeyの検索もできるような物ってありませんでしょうか。

580 名前:デフォルトの名無しさん :2005/09/15(木) 16:28:14
>>579
std::hash_map 但しSGI STL

581 名前:デフォルトの名無しさん :2005/09/15(木) 17:39:07
コンパイルタイムプログラミングで
template <int X>
struct INT { enum { type = X }; };

としたとき、INT<100>::typeは定数値(100)になるのだろうか?
というのはどうやって確かめればいいですか?


582 名前:デフォルトの名無しさん :2005/09/15(木) 17:43:49
出力すればいいだろう

583 名前:デフォルトの名無しさん :2005/09/15(木) 19:44:41
>>581
定数式かどうか確認したいなら typede char array[定数式]; とか。
任意の bool 式のコンパイルチェックは
template <bool> struct static_assert;
template <> struct static_assert<true> { enum { value }; };
static_assert<(100 == 100)>::value; とか。

584 名前:デフォルトの名無しさん :2005/09/15(木) 19:46:27
すまん、typedef char array[定数値];

585 名前:デフォルトの名無しさん :2005/09/15(木) 19:56:26
>>582-584 thx
「#defineマクロとstatic const intではなり、const intやstatic const doubleではならない」
ものって即値と呼ぶのだっけ。定数だとconstでしたごめんなさい。
コンパイル時に固定の数値として評価される値、例えばnumeric_limits<int>::min()など。
このように、コンパイル時に評価されていることを確認するのは、どうすればいいのだろう?


586 名前:デフォルトの名無しさん :2005/09/15(木) 19:59:21
>>585
パフォーマンスにそれほど深刻な影響がなければ、別にコンパイル時評価にこだわる理由はない
というのはよくわかっております。
コンパイルタイムプログラミングしているつもりで、実は実行時に展開されてたら寂しいというだけの理由です。


587 名前:デフォルトの名無しさん :2005/09/15(木) 22:35:25
そんなに不安なら逆アセンブルなりなんなりすればいいじゃん。
VCならデバッグモードで確認できるし、gccなら-Sオプションつけてコンパイルしてもいいけど。

588 名前:デフォルトの名無しさん :2005/09/15(木) 22:47:34
>VCならデバッグモード
………

589 名前:デフォルトの名無しさん :2005/09/15(木) 23:08:41
>>588
何が不満なんだ?

590 名前:デフォルトの名無しさん :2005/09/15(木) 23:12:50
正しくはデュバックムォード

591 名前:デフォルトの名無しさん :2005/09/15(木) 23:13:23
vctoolkitを使ってるけどIDEは無いとか?

592 名前:デフォルトの名無しさん :2005/09/15(木) 23:32:58
cl -FA

593 名前:デフォルトの名無しさん :2005/09/16(金) 00:38:19
C++のstreamライブラリを覚えようと
勉強してるんだけど、全然要領得ないんです。
原因は複雑な設計だったり、極端に略されたメンバ名だったりするんで
なんだかやる気が起きません。
やっぱりC++使ってたらこれらが使えないと一人前とは言えないですかね?

594 名前:デフォルトの名無しさん :2005/09/16(金) 00:51:14
まぁ人の好き好きだが、別なのを勉強した方がいい希ガス。
少なくとも自分はstream系が役に立ったことは無い。

595 名前:デフォルトの名無しさん :2005/09/16(金) 00:56:16
他スレでVC6の bitmap<n> ってバグってるってマルチがあるけど
試したら、ホントにバグってたな
やっぱりあの次期のコンパイラのSTLって過信しないほうがいいのか

596 名前:デフォルトの名無しさん :2005/09/16(金) 01:01:06
iostreamは俺もcin, cout, cerrに出す時以外使ったこと無い
使いにくいから
I/Oクラスが必要なときは自分で作ってる

597 名前:デフォルトの名無しさん :2005/09/16(金) 01:02:43
ちょっと読めないので失礼 >>1-10

598 名前:デフォルトの名無しさん :2005/09/16(金) 01:03:44
>>596
>I/Oクラスが必要なときは自分で作ってる

馬鹿ハケーン。ま、個人レベルで何をやろうが個人の買ってだが、俺の会社に
こういう香具師が面接にきたら、一番最初に落とす。

599 名前:デフォルトの名無しさん :2005/09/16(金) 01:04:25
×買って
○勝手

600 名前:デフォルトの名無しさん :2005/09/16(金) 01:12:45
まぁ自分の書いた文章も確認できない香具師を落とす方が先だなw

601 名前:デフォルトの名無しさん :2005/09/16(金) 01:13:37
>>598
cin cout cerr に出力するサンプルの動作だけを妄信する奴って多いからな
(サンプルがそういうの多いからか)
ここ1年、fstream sstream の実用的な使い方を知って、結構目から鱗状態だったよオレ

602 名前:デフォルトの名無しさん :2005/09/16(金) 01:34:52
職業プログラマは社内のコード共有が優先で標準ライブラリの
ダメな部分も使わなくちゃいけなくて大変だねえ

603 名前:デフォルトの名無しさん :2005/09/16(金) 01:48:40
>>602
うちのプロジェクトなんてコンテナにSTL使わないで
MFCのコンテナ満載だよ
どうやって、こいつらにSTLを啓蒙させようかと悩み中

604 名前:デフォルトの名無しさん :2005/09/16(金) 01:50:11
イテレーターとか、アルゴリズムとの絡みを上手く啓蒙できればアレ

605 名前:デフォルトの名無しさん :2005/09/16(金) 01:57:49
std::stringとCStringの変換がダサい。

606 名前:凶笑面 :2005/09/16(金) 02:16:17
今日の夜9時からフジTVで民俗学ミステリ凶笑面だ。
みんな、見ようぜ。 原作は新潮文庫から出てるよ。
俺はドラゴン桜を見るからビデオに撮るけどな。


607 名前:デフォルトの名無しさん :2005/09/16(金) 04:16:04
>>605
このライブラリ乱立状態をなんとかしろ

608 名前:デフォルトの名無しさん :2005/09/16(金) 04:19:34
Microsoftに言ってくれ

609 名前:デフォルトの名無しさん :2005/09/16(金) 07:25:43
API公開したのはMSだが
それに皮かぶせてMFCを売りつけた他社が
余計で中途半端なコンテナクラス(CStringを含む)
をオマケで付けた弊害が蔓延してるって構図かな

610 名前:デフォルトの名無しさん :2005/09/16(金) 08:39:39
>>605
std::string、std::wstring、AnsiString、WideString、CString、char*、wchar_t*が入り交じってて収拾つきません⊂(。Д。⊂⌒`つ

611 名前:デフォルトの名無しさん :2005/09/16(金) 09:45:55 ?##
>>601
実用的な使いかたって?

612 名前:デフォルトの名無しさん :2005/09/16(金) 12:08:34
template<class Ctype>
class A
{
protected:
Ctype foo;
};

template<class Ctype>
class B : public A<Ctype>
{
void bar()
{
foo = 0;
}
};

こんな感じな事をやろうとすると、
error: ‘foo’ was not declared in this scope
と怒られてしまいます。
Aの継承をintなどで限定するとこのエラーは出ませんでした。
Ctypeのまま継承するにはどうしたらいいでしょうか。

613 名前:デフォルトの名無しさん :2005/09/16(金) 12:31:06
>>612 this->foo

614 名前:デフォルトの名無しさん :2005/09/16(金) 12:32:21
>>612

template<class Ctype>
class A
{
protected:
Ctype foo;
};

template<class Ctype>
class B : public A<Ctype>
{
void bar() {
Ctype::foo = 0;
}
};

615 名前:デフォルトの名無しさん :2005/09/16(金) 12:38:12
いけましたー。ありがとうございます。
しかし、なんかしっくりこないなー。C++の謎は深い。。

616 名前:デフォルトの名無しさん :2005/09/16(金) 13:15:27
>>615
キーワードは
"dependant name"
"unqualified lookup"
"point of definition"
"point of instantiation"

617 名前:もこな :2005/09/16(金) 14:19:14
はじめまして、私はeVc4.0++を使っている者です。
それで まずIEのように とりあえずプログラムを起動したら
MSNやYahooのようなサイトのトップが表示され普通に使える物を作りたいです。
それで作ろうとしたのですが、eVcにはCHtmlViewがサポートされていないようなのでどうしたらよいのか迷ってます。

メニュー → 表示 −> ClassWizard → 関数追加 → OnInitialUpdate関数の追加 → Navigate2(_T("適当にURL"),NULL,NULL);  
上記をしたら error C2065: 'Navigate2' : undeclared identifier
とエラーが出てしまいました。
何故でしょうか。。。??
といいますか、IEを作るにはどうしたら良いでsしょうか。
お願いします

618 名前:デフォルトの名無しさん :2005/09/16(金) 14:26:36
まずは英語の勉強からかな。

619 名前:デフォルトの名無しさん :2005/09/16(金) 15:03:08
>>610
グローバルロケールの影響受けない文字列型ない?


620 名前:デフォルトの名無しさん :2005/09/16(金) 15:38:41
>>617
Windows関連スレか初心者スレ、或いはeVcとやらのスレへどうぞ。

621 名前:デフォルトの名無しさん :2005/09/16(金) 22:41:21
>>593ほか
i/o/iostreamクラスに限って言えばは単にCのFILE *のラッパのような感じだよ。(<<と>>以外は)

622 名前:デフォルトの名無しさん :2005/09/17(土) 18:06:48
std::stringに対し"頭のスペースを削る"とか
"doubleに変換"みたいな事が出来る関数ってありませんでしょうか?
自分で書くしか無いんでしょうか。。

623 名前:デフォルトの名無しさん :2005/09/17(土) 18:08:26
>>622
doubleに変換→boost::lexical_cast
頭のスペース削る→boost::regex

624 名前:デフォルトの名無しさん :2005/09/17(土) 18:09:59
>>622
少なくとも後者はstringstream使うと楽にできる。
前者はそのままでも可能。

625 名前:デフォルトの名無しさん :2005/09/17(土) 18:11:06
>>622
頭のスペースはfind_if+erase

626 名前:デフォルトの名無しさん :2005/09/17(土) 18:12:34
後者だけ。

#include<sstream>
double toDouble(const std::string&s){
    double ret;
    return std::stringstream(s)>>ret,ret;
}

boost::lexical_castを使う方がより良いけど


627 名前:デフォルトの名無しさん :2005/09/17(土) 21:28:39
//doubleに変換
double conv2double(const std::string foo) {return std::atof(foo.c_str());}
// 頭のスペースを削る
std::string cutSpaces(const std::string foo) {return /* すまん、後を頼む */}

628 名前:デフォルトの名無しさん :2005/09/17(土) 21:34:36
じゃあこんな感じで
std::string cutSpace(const std::string & foo){
    return std::string(find_if(foo.begin(),foo.end(),std::bind2nd(std::not_equal_to<char>(),' ')),foo.end());
}


629 名前:デフォルトの名無しさん :2005/09/17(土) 21:36:58
おっとstdの付け忘れがあった。
×find_if
○std::find_if



630 名前:デフォルトの名無しさん :2005/09/17(土) 21:39:48
A trim implementation for std::string
ttp://www.codeproject.com/vcpp/stl/stdstringtrim.asp


631 名前:デフォルトの名無しさん :2005/09/17(土) 22:33:30
すみません、「禿本」とは何を指しているのでしょうか?

VisualC++のスレッドで間違えて聞いてしまいましたが
皆様にC++スレで聞けと仰られたので、、、

632 名前:デフォルトの名無しさん :2005/09/17(土) 22:35:41
>>631
>>5


633 名前:デフォルトの名無しさん :2005/09/17(土) 22:41:35
>>632
ありがとう、早速注文したよ、AMAZONで

634 名前:デフォルトの名無しさん :2005/09/18(日) 00:01:27
boost::trim_left

635 名前:デフォルトの名無しさん :2005/09/18(日) 00:09:26
gcc で日本語の正規表現が使いたいのですが、適当なライブラリはあるのでしょうか?
boost::regex を試してみましたが、うまく動いてくれませんでした。

636 名前:デフォルトの名無しさん :2005/09/18(日) 00:10:21
>>635
http://www.google.co.jp/search?hl=ja&c2coff=1&q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA&lr=lang_ja

637 名前:デフォルトの名無しさん :2005/09/18(日) 01:03:56
>>630
たかがこれだけの事で写真まで載せるあたりがアメリカンだね

638 名前:デフォルトの名無しさん :2005/09/18(日) 01:04:04
>>635
鬼車、これ最強。

639 名前:デフォルトの名無しさん :2005/09/18(日) 01:22:23
>>637
CodeProjectのAuthorはアメリカ人じゃない人の方が多いけどな

640 名前:デフォルトの名無しさん :2005/09/18(日) 01:29:59
日本にはCodeProjectみたいなのはないの?

641 名前:デフォルトの名無しさん :2005/09/18(日) 02:39:37
1 AAA
3 xxxx
10 aaaaa
3 qqqqq
3 aaaaaaa

こんな感じのデータを保存していきたいんですが、
データを取り出すときに、同じ数字のデータごと集めて出したいんです。
(1のデータはaaa,bbb,ccc。3はddd...といった感じで)

vectorやmapで保持すると、取り出すときに数字を一々確認するような形になってしまうのですが、
より良いデータの保持、取り出し方法はありませんでしょうか。

642 名前:デフォルトの名無しさん :2005/09/18(日) 03:08:28
std::multi_map

643 名前:デフォルトの名無しさん :2005/09/18(日) 06:14:37
std::ifstream f;の中身を
全部文字列にしたいときってみんなどうしてる?

std::stringstream s;
s << fi.rdbuf();
std::string result(s.str());


644 名前:デフォルトの名無しさん :2005/09/18(日) 06:30:49
>>643
std::istreambuf_iterator<char> begin(fi),end;
std::string result(begin, end);

645 名前:643 :2005/09/18(日) 07:13:34
>>644
なるほどそうやるのか〜
でも、VC6タソだとだめぽ...


646 名前:デフォルトの名無しさん :2005/09/18(日) 11:37:53
>>640
欲しいねぇ。flipcodeも閉鎖(Readonly化)しちゃったし・・・

647 名前:デフォルトの名無しさん :2005/09/18(日) 14:31:15
猫でもわかるのページの C++のページの26章のファイルの入出力のところで
実行するとファイル名は入力してファイルができるのですが文字が書きこめません。
解かる方教えていただけないでしょうか?

648 名前:デフォルトの名無しさん :2005/09/18(日) 14:32:47
初心者スレへでもどうぞ。つーか、URIくらい提示しろって。

649 名前:デフォルトの名無しさん :2005/09/18(日) 14:39:53
文字列定数を宣言したいときってどっちが速度とかメモリの効率がいいですか?

const char* const str = "test";
const char[] str = "test";


650 名前:デフォルトの名無しさん :2005/09/18(日) 14:43:41
>>648
すいませんでした。

651 名前:649 :2005/09/18(日) 14:55:42
あと、関数内で
文字列定数定義する場合
const char* const str = "test";
const char[] str = "test";

より
static const char* const str = "test";
static const char[] str = "test";

の方が効率いいというのは本当ですか?

652 名前:デフォルトの名無しさん :2005/09/18(日) 15:21:33
const char[] str = "test";
こんな書き方C++で出来たっけ?

653 名前:649 :2005/09/18(日) 15:24:15
>>652
とりあえず手元のVC++7.1ではコンパイル通るのですが、
これってVC++独自拡張でしょうか?

654 名前:デフォルトの名無しさん :2005/09/18(日) 15:27:22
const char str[] = "test";
これじゃなんでだめなの?

655 名前:649 :2005/09/18(日) 15:32:56
bcc5.6.4とg++3.4.3で試したら通りませんでした。
独自拡張だったようです。const char* constの方を使う事にします。
staticの方は関数内では付けた方がいいんでしょうか?

656 名前:デフォルトの名無しさん :2005/09/18(日) 15:33:47
>>654
俺んとこで試したら main 関数がないってエラーがでたよ。

657 名前:649 :2005/09/18(日) 15:36:08
すいませんやっぱりg++でもbccでも通りました。

const char str[] = "test";
ですよ?

const char[] str = "test";
ではなく。

658 名前:デフォルトの名無しさん :2005/09/18(日) 15:36:31
コンパイル通らないけど?これ。
 const char[] str = "test";

>>649
いくらか効率に違いが出るかも知れんが、そんな些細な効率化を意識するよりstaticやchar*、char[]の使い分け方を理解しろって。
状況によって使い分けるものを一緒くたに語ってもしょうがないだろ。

659 名前:649 :2005/09/18(日) 15:38:29
#include <iostream>

const char str[] = "test";
int main()
{
using namespace std;
cout << str << endl;
return 0;
};


これそのままコピペしたら通ると思います。
結局どっちがいいんでしょうか?

660 名前:デフォルトの名無しさん :2005/09/18(日) 15:39:12
アセンブラのソース見れば一発じゃん

661 名前:デフォルトの名無しさん :2005/09/18(日) 15:39:21
すいまらん最初の方に
const char[] strとか自分で書いてました。
const char str[]が正解です。

662 名前:649 :2005/09/18(日) 15:42:08
>>660
それが一番手っ取り早そうですね。
ありがとうございました。

663 名前:デフォルトの名無しさん :2005/09/18(日) 15:42:23
const char* const str = "test";
const char str[] = "test";

最適化すれば、この二つって意味的に同じ物になる?

664 名前:デフォルトの名無しさん :2005/09/18(日) 15:43:51
全く違います

665 名前:デフォルトの名無しさん :2005/09/18(日) 15:45:13
>>664
どういうときに?ポインタのアドレスを取るようなコードがないとしたらどう?

666 名前:649 :2005/09/18(日) 15:50:50
>>663
違いました。
コンパイラが吐いたアセンブラのリスト見れば分かります。
コンパイラの最適化ってまだそんなもんなんですね。

667 名前:649 :2005/09/18(日) 15:51:50
ちなみにアセンブラリストは
cl -G7 -O2 -GF -FAs test.cpp
で吐かせました

668 名前:デフォルトの名無しさん :2005/09/18(日) 15:57:36
>>649
で、メモリ効率の良し悪しは?

669 名前:デフォルトの名無しさん :2005/09/18(日) 15:59:17
ポインタ1個分

670 名前:デフォルトの名無しさん :2005/09/18(日) 16:00:51
考えるまでもなく前者
後者は存在意義自体疑問

671 名前:デフォルトの名無しさん :2005/09/18(日) 16:02:58
>>670
なんで?

672 名前:デフォルトの名無しさん :2005/09/18(日) 16:04:37
>>664
解説キボンヌ

673 名前:デフォルトの名無しさん :2005/09/18(日) 16:07:43
>>672
>>669

674 名前:デフォルトの名無しさん :2005/09/18(日) 16:09:08
#define str "test"

が最強
最適化されるコンパイラ多数
Cでも使える

675 名前:デフォルトの名無しさん :2005/09/18(日) 16:43:57
int _tmain(int argc, _TCHAR* argv[])
{
    const char* const           str0    = "test"; 
    const char                  str1[]  = "test";
    static const char* const    str2    = "test"; 
    static const char           str3[]  = "test";
    #define str4 "test"

    std::cout << str0;
    std::cout << str1;
    std::cout << str2;
    std::cout << str3;
    std::cout << str4;

    return 0;
}

これだと、
str4 = str3 > str2 > str0 > str1

676 名前:デフォルトの名無しさん :2005/09/18(日) 17:11:17
void sub();

int _tmain(int argc, _TCHAR* argv[])
{
    const char* const           str0    = "test"; 
    const char                  str1[]  = "test";
    static const char* const    str2    = "test"; 
    static const char           str3[]  = "test";
    #define str4 "test"

    std::cout << str0;
    std::cout << str1;
    std::cout << str2;
    std::cout << str3;
    std::cout << str4;

    return 0;
}

void sub()
{
 puts(str4);
}

#defineキモッ

677 名前:デフォルトの名無しさん :2005/09/18(日) 17:51:16
>>651
本当だよ。

関数ローカルでの
 const char str[] = "test";
は、
・ローカルなメモリ領域(一般的には関数のスタックフレーム内)
・初期化するためのデータ(この場合では"test")
・初期化するためのコード(この場合ではmemcpyとか)
を必要とする。

それに対して
 static const char str[] = "test";
なら "test" の実体を静的に用意すればいい。

678 名前:デフォルトの名無しさん :2005/09/18(日) 18:02:00
"test"とstrがどのセクションに割り当てられてどういう風に初期化されるっかてことだろ。

679 名前:デフォルトの名無しさん :2005/09/18(日) 21:42:22
struct hoge {
size_t size;
void *data;
};

のdataが指し示すsizeバイトのヒープメモリを解放するには、
どうすりゃいいんですか?
適当に、delete[size] (char*)data;とやってみたら、コンパイルは通ったけど、
違う?

680 名前:デフォルトの名無しさん :2005/09/18(日) 21:44:40
void*ってことは何がくるか分からないってことなのか?
素直に考えればインターフェースに分離するかテンプレートだと思うが。


681 名前:デフォルトの名無しさん :2005/09/18(日) 21:45:26
>>679
new char [...]で確保したことが確実なのならまあそれでいいんだが
それ以外の確保の可能性があるのなら(mallocやnew 他の型)駄目

682 名前:デフォルトの名無しさん :2005/09/18(日) 21:47:01
確保方法によって方法変わるからどうやってメモリ確保したか教えて。

683 名前:デフォルトの名無しさん :2005/09/18(日) 21:48:34
dataは様々な構造体で確保したデータを指します。

684 名前:679 :2005/09/18(日) 21:53:30
struct Apple;
hoge h;
h->data = new Apple;
h->size = sizeof(Apple);
みたいな感じです。

685 名前:デフォルトの名無しさん :2005/09/18(日) 21:55:53
ついでにtypeidも取得しといたらどうだw

686 名前:デフォルトの名無しさん :2005/09/18(日) 21:58:35
struct Object{
 virtual ~Object(){}
};
struct hoge{
  size_t size;
  Object*data;
};
とかにして使う型をObjectから派生させちゃ駄目ですか?

687 名前:デフォルトの名無しさん :2005/09/18(日) 21:59:04
素直にテンプレートでも使おうよ。

688 名前:デフォルトの名無しさん :2005/09/18(日) 22:06:30
void (*ReleaseData)(); みたいなメンバを用意して、data を設定すると同時に解放用の関数を設定してもらうとか

689 名前:デフォルトの名無しさん :2005/09/18(日) 22:07:44
どうでもいいけど、様々な構造体で確保した data を、種類も知らずにどうやって使うのだろうか
それとも単なるコレクション?

690 名前:デフォルトの名無しさん :2005/09/18(日) 22:11:07
暇だったから
今は反省している

691 名前:デフォルトの名無しさん :2005/09/18(日) 22:43:44
VisualC++なんだけど
new・mallocとdelete・delete[]・freeの
どの組み合わせでもリークしないんだが
そういうもん?

692 名前:デフォルトの名無しさん :2005/09/18(日) 22:48:05
んな訳ねーだろwwwwwwwwwwwwwww

693 名前:デフォルトの名無しさん :2005/09/18(日) 22:50:52
まぁコンストラクタもデストラクタもないPODなデータ形式でかつ、
たまたまnewとmallocのメモリの確保方法が同じであればリークはしないな。

そんなコード書くやつは死んでくれた方がありがたいがな

694 名前:679 :2005/09/18(日) 23:27:35
どうも。
結局、派生させました。

695 名前:デフォルトの名無しさん :2005/09/18(日) 23:48:47
>>691
これリークしない?
#include <stdlib.h>
struct hoge {
    int* p_;
    hoge() : p_(new int[16777216]) {}
    ~hoge() {delete[] p_;}
};
int main() {
    hoge* p = new hoge();
    free(p);
}

696 名前:デフォルトの名無しさん :2005/09/19(月) 00:01:56
リークもくそも無茶苦茶でんがな

697 名前:デフォルトの名無しさん :2005/09/19(月) 00:15:43
ワロスw

698 名前:デフォルトの名無しさん :2005/09/19(月) 00:31:46
>>691
ほい
std::vector<std::string> * p = (std::vector<std::string> *) malloc( sizeof (std::vector<std::string>) );



699 名前:デフォルトの名無しさん :2005/09/19(月) 00:36:14
>>691
たしかにVCのoperator new/new[]/delete/delete[]()はmalloc/freeを呼ぶ実装になっている。
だからと言って混同して良いものではないし、コンストラクタ・デストラクタが絡むとやばい。

700 名前:デフォルトの名無しさん :2005/09/19(月) 00:45:52
派生クラスやコンテナをfreeで開放するのはまずいっしょ。
deleteなら基底クラス/各オブジェクトのデストラクタを呼んでくれる。

701 名前:デフォルトの名無しさん :2005/09/19(月) 01:11:04
じゃあこれならOK?
class A;
A* a = new A;
a->~A();
free(a);

702 名前:デフォルトの名無しさん :2005/09/19(月) 01:34:21
>>701
だからfree()はやめろとあれほど

703 名前:デフォルトの名無しさん :2005/09/19(月) 01:42:10
ん?ちょっと話が戻るけど>>679の開放はnewした時にどんな構造体かに関わらず
delete [] data;
とやるだけでnewしたときの分がちょうど開放されるわけではないの?
malloc/freeの組み合わせも同様で。

どのコンパイラだか忘れたけど、動的確保したバイト数を、newで返るアドレスの手前に保存するのがあったはず。
まあコンパイラの実装方法は多々あるのかもしれないが、newした分のバイト数は内部でしっかりとっておかないと、普通に素直なnew/deleteしたときも困らないか?

標準を知る者求む。

704 名前:デフォルトの名無しさん :2005/09/19(月) 01:44:31
>>703
hoge h;
h.data=new hoge;

705 名前:703 :2005/09/19(月) 02:19:11
>>704
あぁ、そういうことか。でも
h.data = new hoge; なら delete h.data;
h.data = new hoge[size]; なら delete [] h.data;
のどちらかしか使わないことように徹底した場合はどう?
まあそんな保守性低いもの書くくらいなら>>679みたいなの書かない方がいいわけだけど。
とりあえず、動的確保した大きさが内部で保存されてるってのは標準で保証されてるのかどうかが疑問点。

706 名前:デフォルトの名無しさん :2005/09/19(月) 03:00:01
>>705 保証されてないよ。

707 名前:デフォルトの名無しさん :2005/09/19(月) 03:37:07
>>704の意味がわからないんだけど
これのこと?
これならVCでは駄目だったなぁ。

struct A
{
    char* a;
    A(){ a = new char[100];}
    ~A(){ delete [] a;}
};

struct B
{
    void* a;
};

{
    B b;
    b.a = (void*)new A;
    delete b.a;
}

708 名前:デフォルトの名無しさん :2005/09/19(月) 03:51:24
そんな糞なVCは窓から投げ捨てろ!

709 名前:デフォルトの名無しさん :2005/09/19(月) 04:03:43
>>708 別にVCだからダメなわけじゃない。コードがダメ。

710 名前:デフォルトの名無しさん :2005/09/19(月) 09:47:42
そもそもわざわざそんなコード書いて何が楽しいのかさっぱりわからん

711 名前:デフォルトの名無しさん :2005/09/19(月) 12:21:16
ロマン

712 名前:デフォルトの名無しさん :2005/09/19(月) 16:35:07
class B;
class A {
    public: B method() { return B(); }
};
class B: public A {}
みたいな循環した宣言って無理?

713 名前:デフォルトの名無しさん :2005/09/19(月) 16:41:18
>>712
無理だろうな。
基底クラスが派生クラスを知っているという状況は、一般的におかしい。

714 名前:デフォルトの名無しさん :2005/09/19(月) 16:43:24
不完全型

715 名前:デフォルトの名無しさん :2005/09/19(月) 16:45:19
というかBがAを継承しているなら、必要なメンバ関数をvirtualにしてA*を返せばいい話じゃ

716 名前:712 :2005/09/19(月) 17:04:42
うーん、やっぱり無理か…。
Object a, b, c;
a[0] = b;
c = a[0]
こんな感じの振る舞いをするクラスが必要になったので、最初は以下のようなコード
class Assigner {
nbsp;nbsp;nbsp;nbsp;...
nbsp;nbsp;nbsp;nbsp;operator=(Object obj) { /* setter */ }
nbsp;nbsp;nbsp;nbsp;operator Object() { /* getter */ }
};
class Object {
nbsp;nbsp;nbsp;nbsp;...
nbsp;nbsp;nbsp;nbsp;Assigner operator[](int i) { return Assigner(this, i); }
};
を書いたんだけど、これだと
a[0].method();
などが動かないので、AssignerをObjectの派生クラスにしてしまおうと
考えたんだけど…。

識者の方、何か良い方法があったら教えてください。

717 名前:712 :2005/09/19(月) 17:07:12
うげ。置換ミスった。
class Assigner {
    ...
    operator=(Object obj) { /* setter */ }
    operator Object() { /* getter */ }
};
class Object {
    ...
    Assigner operator[](int i) { return Assigner(this, i); }
};


718 名前:デフォルトの名無しさん :2005/09/19(月) 17:13:21
>>716-717
Assigner の意味がわからない。

719 名前:デフォルトの名無しさん :2005/09/19(月) 17:23:31
確かにそのコードからだけじゃAssignerの存在価値がわからん

720 名前:デフォルトの名無しさん :2005/09/19(月) 17:30:44
>>712
>>176-717を見ていなかったときの俺ならこう答えた。
template <typename T>
class A {
public:
    T func() {return T();}
};
class B : public A<B> {};

721 名前:デフォルトの名無しさん :2005/09/19(月) 17:38:46
普通にvectorとかに入れときゃいいやん
AとBの継承関係が無理やりすぎ

722 名前:デフォルトの名無しさん :2005/09/19(月) 17:45:10
このスレはレスの多さでどれくらいレベルが低い質問なのかよくわかりますね。

723 名前:デフォルトの名無しさん :2005/09/19(月) 18:21:22
>>718, >>719
略しすぎて訳わかんないな。ごめんなさい。
急にコードが具体的になって申し訳ないんだけど、
PythonのC拡張を書く関係で、Pythonのオブジェクトを表すPyObjectのwrapperを書いてる。
で、Pythonオブジェクトの属性の取得/代入を[]演算子で行いたい。
value = obj["attr_name"];
obj["attr_name"] = value;
こんな感じで。なお、属性はPyObject_{Get|Set}AttrString()で可能。

class PyObjectWrapper
{
 public:
  PyObject* mObj;

  PyObjectWrapper() {}
  PyObjectWrapper(PyObject* obj): mObj(obj) {}

  class Assigner
  {
   public:
    PyObject* mObj;
    string mKey;

    Assigner(PyObject* obj, const string& key): mObj(obj), mKey(key) {}

    operator PyObjectWrapper()
    {
     PyObject* pobj = PyObject_GetAttrString(mObj, (char*)mKey.c_str());
     return PyObjectWrapper(pobj);
    }


724 名前:デフォルトの名無しさん :2005/09/19(月) 18:22:46

    void operator=(const PyObjectWrapper& pobj)
    {
     PyObject_SetAttrString(mObj, (char*)mKey.c_str(), pobj.mObj);
    }
  };

  PyObjectWrapper operator[](const string& key) const
  {
   return Assigner(mObj, key);
  }
};

このコードで値の取得/代入はできるが、
obj["name"].PythonObjectのメンバ();
はできないので、AssignerをPythonObjectの派生クラスに…と考えたのです。

725 名前:デフォルトの名無しさん :2005/09/19(月) 18:34:12
こう?
class PyObjectWrapper {
PyObject& operator[](const string& key);
};


726 名前:デフォルトの名無しさん :2005/09/19(月) 18:39:14
>>723-724
質問をぶった切ることになるけど、 boost::python でも見るといいんじゃないかな?
勉強じゃないなら、そのまま使うとか。

727 名前:デフォルトの名無しさん :2005/09/19(月) 18:41:56
>>723, 724
アドホックな解決策として、Assignerで
PyObject *operator->() const {
  return mObj;
}
としておけば、
obj["name"]->メンバ();
は使えるようになるんじゃまいか。
boost::python使うのが一番手っ取り早いだろうけど。

728 名前:デフォルトの名無しさん :2005/09/19(月) 20:33:00
COMのスレってどこいっちゃったの?

729 名前:デフォルトの名無しさん :2005/09/19(月) 20:47:02
>>728
つ [ http://find.2ch.net/?BBS=ALL&TYPE=TITLE&STR=COM&COUNT=50 ]

730 名前:デフォルトの名無しさん :2005/09/19(月) 21:14:15
int *i;
i = new int[x];
動的に確保した配列の数(x)をどうやって算出するのか
おしえてください。

731 名前:デフォルトの名無しさん :2005/09/19(月) 21:16:43
基本的にはできない。
別変数に個数を保存しておくか、vectorのように配列のサイズを知ることができるコンテナを使う。

732 名前:デフォルトの名無しさん :2005/09/19(月) 23:48:23
ttp://ccfa.info/cgi-bin/up/src/up16469.gz
gcc4.0で上のファイルがコンパイルできなくて困っています。
gcc3.2や3.3(とそのlibstdc++)ではコンパイル出来るみたいなんですが、
どこが悪いのでしょうか。

733 名前:デフォルトの名無しさん :2005/09/19(月) 23:56:45
>>732
エラーが出るならエラーメッセージぐらい貼れ。
あと、内容によっては↓こっちかもしれない。
http://pc8.2ch.net/test/read.cgi/tech/1121146723/

734 名前:デフォルトの名無しさん :2005/09/20(火) 01:01:39
>>733
すいません。
g++ .... -c mqodrawer.cc -o mqodrawer.o
material.hh:22: error: ‘Vector4’ has not been declared
material.hh:22: error: expected ‘,’ or ‘...’ before ‘<’ token
material.hh:23: error: ‘Vector4’ has not been declared
material.hh:23: error: expected ‘,’ or ‘...’ before ‘<’ token
material.hh:24: error: ‘Vector4’ has not been declared
material.hh:24: error: expected ‘,’ or ‘...’ before ‘<’ token
...
こんな感じのエラーです。

735 名前:デフォルトの名無しさん :2005/09/20(火) 01:29:43
>>734
そのまんまじゃねーか。
↓これだろ。
//#include "vector.hh"
#include "texture.hh"

namespace bkl {
#include "vector.hh"

Vector4 が ::bkl::bkl::Vector4 になってる。
::bkl 内で Vector4 では見つからない。

こんなことになるから、 namespace の中で #include するな。

736 名前:デフォルトの名無しさん :2005/09/20(火) 01:40:59
>>735
すいません。それはnamespaceの外でincludeしても同様のエラーが出ます。
元々外のコメントアウトされたものだけだったんですが、見つからんと言われたので
色々書き換えてたのが残ってしまっていました。

#include "vector.hh"
#include "texture.hh"

namespace bkl {
//#include "vector.hh"
このようにしても、エラーコードはかわりませんです。。

737 名前:デフォルトの名無しさん :2005/09/20(火) 02:21:57
>>736
手元の 3.4@cygwin では、その修正で問題なくなる。
エラーメッセージが変わらないわけ無いとおもうんだが。

もう一度試しても、本当に >734 のエラーになるか?
エラーメッセージはそのままコピペしてるか?

738 名前:デフォルトの名無しさん :2005/09/20(火) 02:33:25
>>737
はい、全く同じエラーになります。自分の環境(FedoraCore4)のgcc3.2でも通ります。
が、gcc4では通りません。。

739 名前:デフォルトの名無しさん :2005/09/20(火) 03:28:29
まさか…gcc4環境からそのヘッダにパスが通ってないとか言わないよな…
だとしたら死んでも償いきれないぞっ!!

740 名前:デフォルトの名無しさん :2005/09/20(火) 08:27:07
usingディレクティブである名前空間を丸ごと可視化しようとして、シンボル名が衝突してしまいます。
名前空間を直接指定してスコープ解決すればいいのはわかっていますが、
小手先の方法として、あるひとつのシンボルを優先して解決するような方法はいまりすでしょうか。

本当はそうならないように設計すべきだということはわかっているのですが……
お願いします。

741 名前:デフォルトの名無しさん :2005/09/20(火) 08:41:17
>解決するような方法はいまりすでしょうか。

いまりません。

742 名前:デフォルトの名無しさん :2005/09/20(火) 09:45:02
いまハムスターです

743 名前:デフォルトの名無しさん :2005/09/20(火) 12:05:00
>>738
同じディレクトリにあるヘッダですし、
他のファイルからもincludeされているヘッダなのでそれはないです。
何故出来ないんだろう。。

744 名前:デフォルトの名無しさん :2005/09/20(火) 12:34:50
freopenを使わないでstd::coutをファイルにする方法ってないの?

745 名前:デフォルトの名無しさん :2005/09/20(火) 12:43:55
リダイレクト

746 名前:デフォルトの名無しさん :2005/09/20(火) 12:48:21
>>744
逆に、どうやってstd::freopen()を使ってstd::coutをファイルにするのか聞きたい。

747 名前:744 :2005/09/20(火) 12:50:57
>745
リダイレクトってOSの?それでは駄目だ。
>746
ごめん。std::freopenではなくて、Cのだ。

748 名前:デフォルトの名無しさん :2005/09/20(火) 12:58:33
普通そういう場合は設計段階から考慮して、ストリームをostream&なりで保持して
後から切り替えができるようにするもんじゃないか

749 名前:デフォルトの名無しさん :2005/09/20(火) 13:03:12
クラスをポインタ型で宣言して
メンバ関数のアドレスを取得しようとすると
「仮想関数のアドレスを取ろうとしました」って言われる

CGame *game;
game = new CGame;
&(game->Main);  // エラー

こんな感じ
なんで仮想関数?

750 名前:デフォルトの名無しさん :2005/09/20(火) 13:07:12
>>749
CGame::Mainが仮想関数なんじゃないの?


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