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


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

C++相談室 part50
1 名前:デフォルトの名無しさん :2006/06/04(日) 22:21:22
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

  → テンプレその他 >>1-15 付近参照 ←

前スレ
C++相談室 part49
http://pc8.2ch.net/test/read.cgi/tech/1146185570/

2 名前:デフォルトの名無しさん :2006/06/04(日) 22:22:04
1 http://piza.2ch.net/tech/kako/980/980175292.html
2 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html

3 名前:デフォルトの名無しさん :2006/06/04(日) 22:22:41
16 http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/

4 名前:デフォルトの名無しさん :2006/06/04(日) 22:24:00
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/
39 http://pc5.2ch.net/test/read.cgi/tech/1106466303/
39(実質40) http://pc8.2ch.net/test/read.cgi/tech/1106527792/
40(実質41) http://pc8.2ch.net/test/read.cgi/tech/1113408957/
41(実質42) http://pc8.2ch.net/test/read.cgi/tech/1120190961/
43 http://pc8.2ch.net/test/read.cgi/tech/1124113879/
44 http://pc8.2ch.net/test/read.cgi/tech/1128512737/
45 http://pc8.2ch.net/test/read.cgi/tech/1133007604/

5 名前:デフォルトの名無しさん :2006/06/04(日) 22:25:06
46 http://pc8.2ch.net/test/read.cgi/tech/1136690107/
47 http://pc8.2ch.net/test/read.cgi/tech/1139931895/
48 http://pc8.2ch.net/test/read.cgi/tech/1142423595/
49 http://pc8.2ch.net/test/read.cgi/tech/1146185570/

6 名前:デフォルトの名無しさん :2006/06/04(日) 22:27:11
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

[禿 Stroustrup]
 http://public.research.att.com/~bs/
[C++ International Standard]
 http://www.kuzbass.ru/docs/isocpp/
 http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)

7 名前:デフォルトの名無しさん :2006/06/04(日) 22:30:01
■Books■
amazon.com C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
 ttp://www.amazon.com/exec/obidos/ASIN/0201700735/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 ttp://www.amazon.com/exec/obidos/ASIN/0201824701/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 ttp://www.amazon.com/exec/obidos/ASIN/0201379260/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 ttp://www.amazon.com/exec/obidos/ASIN/0201924889/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 ttp://www.amazon.com/exec/obidos/ASIN/020163371X/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 ttp://www.amazon.com/exec/obidos/ASIN/0201615622/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 ttp://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
 ttp://www.amazon.com/exec/obidos/ASIN/0201760428/
C++ Coding Standards
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4894716860/ (翻訳)

8 名前:デフォルトの名無しさん :2006/06/04(日) 22:32:23
■Books(Templateまわり)■
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/

9 名前:デフォルトの名無しさん :2006/06/04(日) 23:14:10
cuj がそのまんまだな。
結局どうしたらいいんだろう?
リダイレクトされるここに修正すればいい?
http://www.ddj.com/dept/cpp/cuj.jhtml

10 名前:デフォルトの名無しさん :2006/06/04(日) 23:28:31
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache STDCXX http://incubator.apache.org/stdcxx/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

11 名前:デフォルトの名無しさん :2006/06/04(日) 23:32:03
■関連スレ■
【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/
【C++】STL(Standard Template Library)相談室 5
http://pc8.2ch.net/test/read.cgi/tech/1143608073/
C/C++の宿題を片付けます 65代目
http://pc8.2ch.net/test/read.cgi/tech/1147908265/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!! 002
http://pc8.2ch.net/test/read.cgi/tech/1139043535/
C++/CLI について語ろうぜ Part2
http://pc8.2ch.net/test/read.cgi/tech/1142147319/
くだすれC++Builder(超初心者用)その2
http://pc8.2ch.net/test/read.cgi/tech/1144308804/
ATL/WTL Part4
http://pc8.2ch.net/test/read.cgi/tech/1134388951/
【雑談】C/C++【その1】
http://pc8.2ch.net/test/read.cgi/tech/1098817686/

12 名前:デフォルトの名無しさん :2006/06/04(日) 23:33:13
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。


C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

13 名前:デフォルトの名無しさん :2006/06/04(日) 23:49:16
>>12


14 名前:デフォルトの名無しさん :2006/06/05(月) 00:23:42
v(^・^)v

15 名前:デフォルトの名無しさん :2006/06/05(月) 00:31:08
>>1
                                 _  / ⌒)
                            _,. ‐'´ ̄ {   ヽkュく
                         _, ィ^ヽ丶\\ `Y   j>─‐┐
. \\   ィ    ──ァ        /〉   ,イ /i|\__\∠、 \ゝ.  ハ.   /
   > > │    /        //   ///川、 \イじツ Yi \!イ廴ヽ./\
 //  ┴   ∠ _」    //   ! ||ト|ゝハァュ一   ||j |三三三三三 \.   /〉
                  o'´     _`ヘゝヽヘ.¨ f⌒>、ルじj三三三三三三ツヲ7/
                        `ヾ _>ド、ゞ .ノ ゞ==三三三 r'´1j│}ク'/ト
                     r===テミ 、 ヽ>、 ィvi|二ユ三_,/  メ'7´/三i
                     j   /'´ ̄ ̄`¨ ┴┴'─  ¬!   ´ _/三三j
                   /リ¬、_           __/-‐=イ三三三=i
                  //i^メミュ! 丶、__,  ィY7フ´  /    j三三三三!
                /三⊆ミ‐=' \_, `' Yr──┴─ ¨´‐- ̄\ /三三三三|
               /三三三三ヘ __/__厶_          /ヾ 、三三三|
              /三三三三三三三三|     ̄ フ  _     /_」j三三三j
             //三三三三三三三三ハ      /   ` ¬''´三三/三三/
           //三三三三三三三三三ノ      /      /三三三j三三/
          //イ三三//三三三三三//           _/三三//三 /
         ////三/ /三三三三 _/             〈三三/ 〃//

16 名前:989 :2006/06/05(月) 00:57:35
>>前スレ991
ありがとうございます
なんとなくですが理解できました

>JavaとかC#の人?
そうです
普段使っているのはC#、Java、VB.NETあたりです

17 名前:デフォルトの名無しさん :2006/06/05(月) 02:18:26
>>12
> STLつかうと一気に実行ファイルサイズが10倍に?!
>
> 環境によるだろ。
> 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
> ランタイムを使用するようにして使っているが、例えばstd::vectorを
> 使っても使わない時と比べ10Kほどしか増えない。
>
> すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

経緯を知らないので聞くが、このやり取りって何?


18 名前:デフォルトの名無しさん :2006/06/05(月) 02:28:09
Part16が初出じゃね?
http://pc8.2ch.net/test/read.cgi/tech/1045746245/15

もう一つの方はPart17から
http://pc8.2ch.net/test/read.cgi/tech/1047560042/21




19 名前:デフォルトの名無しさん :2006/06/05(月) 02:50:10
>>18
ども。流れ読んできた。

話が散逸していたのでうまく切りにくいが、
せめて↓はテンプレに入れた方がいい気がした。
(ノードベースコンテナならどうだとかツッコミ始めるとキリがないが)

part16の27から抜粋:
> STLはDLLに追い出せてないと思います。何せテンプレートで、コンパイル時
> にしかわからないものばかりのはずですから。


20 名前:デフォルトの名無しさん :2006/06/05(月) 03:07:21
int や char 等であっても、非局所的な静的変数の初期化順序は、
未定義なんですか?

21 名前:デフォルトの名無しさん :2006/06/05(月) 09:09:16
>>20
特に決まってないみたい。
一般的な実装ではプログラムイメージをメモリにロードした時点で
初期化が完了している。個々の順番とかいうのはわかんないね。

22 名前:20 :2006/06/05(月) 10:16:20
>>21
良く判らないのですが、int や char、POD型なら main 関数前に参照しても
初期化されてるから大丈夫って事ですか?

23 名前:デフォルトの名無しさん :2006/06/05(月) 10:28:13
>>22
main 関数前に参照って、どこでやるつもり?
グローバルオブジェクトのコンストラクタ("dynamic initialization"に含まれる)なら、
必ず POD の初期化("static initialization"に含まれる)の後に来るから大丈夫。

24 名前:デフォルトの名無しさん :2006/06/05(月) 12:03:01
const int A = 20;
const int B = A * 10;

こういうのはどうなんだろう?
#define の代わりとして const の仕様をわざわざ変えた以上、
これは期待通りに動くように(B が 200 になるように)
仕様で決められてるべきだと思うんだけど。

25 名前:デフォルトの名無しさん :2006/06/05(月) 12:21:09
それのどこが静的変数?

26 名前:デフォルトの名無しさん :2006/06/05(月) 13:08:33
cやc++は関数の引数に配列を直接渡せないって本当ですか?

27 名前:デフォルトの名無しさん :2006/06/05(月) 13:25:00
なかなか、楽しい人が来たな

28 名前:26 :2006/06/05(月) 13:36:04
>>27
俺のこと?ごめんでも
ttp://www.01-tec.com/document/code_design/vol06.html
このページにこう書いてあったんだ


ただ,C/C++の関数では引数に配列が渡せないので
配列のサイズ情報も引数に渡す必要がありました
(C/C++って微妙に不便ですね).


29 名前:デフォルトの名無しさん :2006/06/05(月) 13:39:50
C++ならテンプレートを使って配列を渡せるんだがな。

30 名前:26 :2006/06/05(月) 13:42:27
>>29
kwsk!

31 名前:デフォルトの名無しさん :2006/06/05(月) 13:45:13
>>28
そのページ、配列のサイズも自動で読み取るtemplateも書けることは
言及せず、サイズを指定する必要があると書いてるんだな

ともあれC++では、配列以外にも配列のようなもの(シーケンス)も
まとめて共通概念として使えるように整備されてるし、
すでに配列以外のテンプレート・コンテナが多数あるので
逆にCから引き継がれた「配列」がわりと邪魔だったりする。

std::vectorなんかが普通にいう配列みたいなポジションになってるので
これなら引数に普通に渡せるよ。

32 名前:29 :2006/06/05(月) 13:52:17
>>30
例えば配列の要素数を返す関数はこうなる。
template<typename T, std::size_t N> inline std::size_t numberof(T (&)[N]) {return N;}

でもまぁ、>31の言うように普通にvectorを渡せよって気もする。
static bool find(std::vector<int> const & foo, int ch)
{
std::vector<int>::const_iterator it = std::find(foo.begin(), foo.end(), ch);
return !(it == foo.end());
}
const int foo[] = {1, 3, 4, 6, 8, 10, 12};
std::vector<int> vfoo(foo, foo + sizeof(foo) / sizeof(* foo));
cout << func(vfoo, 2) ? "Found" : "Not found";
// ブラウザで直書きだから間違ってたらゴメン。

33 名前:26 :2006/06/05(月) 14:21:09
>>31さん
>>32さん
まじ勉強になります。ありがとうございました!

34 名前:デフォルトの名無しさん :2006/06/05(月) 16:06:54
local referenceってどういう使い道があるのですか?

35 名前:デフォルトの名無しさん :2006/06/05(月) 16:15:06
>>34
ハンドルの獲得が主じゃないかね。
ポインタでも同じことはできるけど、ポインタよりも束縛が強い分、安心して使える。

36 名前:デフォルトの名無しさん :2006/06/05(月) 16:35:28
1000行程度のサイズのファイルから1行ずつ読み込み、
それを又1行ずつコンソールに表示しておわり、というプログラム
を書きたいのですが、以下のように書くと最後の行だけ2回表示されて
しまいます。どう書けばよいか教えてください。
--------------------------------------------------------
#include <iostream>
#include <fstream>
int main()
{
std::ifstream ifs("test.csv");
std::string str;
while (! ifs.eof()) {
ifs >> str;
std::cout << str << std::endl;
}
return 0;
}
--------------------------------------------------------
よろしくお願いします。


37 名前:デフォルトの名無しさん :2006/06/05(月) 16:42:08
for (;;) {
 ifs >> str;
 if (ifs.eof()) break;
 std::cout << str << std::endl;
}

38 名前:デフォルトの名無しさん :2006/06/05(月) 16:42:11
#include <iostream>
#include <fstream>
int main()
{
std::ifstream ifs("test.csv");
std::string str;
while (std::getline(ifs, str)) {
std::cout << str << std::endl;
}
return 0;
}


39 名前:34 :2006/06/05(月) 16:46:30
>>35
すみません。ハンドルってのが何を指すのかわかりません
たとえば
int i;
int &j = i;

このときの j がハンドルですか?
そうだとするとこれのメリットがわかりません

結局iもjも同じものを指すに過ぎないのだから
2つも同じものを指すものが存在したところで
どんなメリットが生じるのでしょうか?

それとリファレンスはポインタよりも束縛が強い
とのことですが、束縛が強いとはどういう意味でしょうか?
ポインタみたいにリファレンスはそれを使った演算が出来ない点
をいっているのでしょうか?

長くなって失礼しました

40 名前:デフォルトの名無しさん :2006/06/05(月) 17:06:38
>>39
例えば配列内の同じ要素に何度もアクセスする場合、
array[1][2][3] は *(array+1+2+3) のように、毎回位置を計算する必要があるだろ?
これを前もって
int& elem=array[1][2][3];
としておいて、その後の要素アクセスはelemを使うようにすれば位置計算が省ける、とそういう理屈。
ポインタでも同じことは可能だけれど、アスタリスクがついたり何かと見辛いのが難点。
参照は普通の変数と同じように扱えるから、比較的綺麗なコードになる。
もちろんこんな例はコンパイラの最適化でも同じような効果があるからあまり意味はないんだけども。
もうちょっと複雑になってくると重宝する。

コードが見やすくなるのもメリット。
多次元配列や複雑な要素アクセスは見辛いからな。
別名をつけておくことで、格段に読みやすいコードになる場合も多々ある。

その類で、シングルトンを使う際の省略にも使ったりする。
例えば

Hoge::getSingleton().method1();
Hoge::getSingleton().method2();

と書く代わりに、関数の先頭で一回だけ

Hoge& ref = Hoge::getSingleton();

のように取得しておいて、関数内では

ref.method1();
ref.method2();

みたく使えば見通しがいいコードになる。
IrrlichtEngineなんかはこういう記法を多用してたな。

41 名前:デフォルトの名無しさん :2006/06/05(月) 21:12:12
Cだと直接触って欲しくないリソースを制限するのに使う
ポインタを直接晒してクライアントに操作されちゃマズーなんで、
ハンドル経由で操作させる
Win32APIとか

42 名前:デフォルトの名無しさん :2006/06/06(火) 00:00:58
質問です。
struct A
{
 int a, b, c, d, e, f;
 A(const A& x);
 A& operator = (const A& x);
};
が有ったとします。で、コピーコンストラクタと代入演算子ですが、
c 以外のメンバーはビットコピーし、c だけ 0 に置き換えたいの出すが、
この場合、それぞれの定義で
a = x.a; b = x.b; c = 0; d = x.d; e = x.e; f = x.f;
か、
memcpy(...); c = 0;
しか手っ取り早い方法はないですか?

43 名前:デフォルトの名無しさん :2006/06/06(火) 00:21:47
cだけ0って時点で、なんか怪しい構造体だな。

44 名前:デフォルトの名無しさん :2006/06/06(火) 00:33:40
>28
Cだって、コンパウンドリテラルがあるから直接配列渡せるはず

45 名前:デフォルトの名無しさん :2006/06/06(火) 00:55:22
>>42
なぜ、そんなことをしたいのかが気になる

46 名前:42 :2006/06/06(火) 01:07:00
>>43,45
あくまで例えなんで。また、もう一つ例えで
class X
{
public:
 X(const X&);
 X& operator = (const X&);
private:
 ・・・ // メンバー変数いっぱい
 struct impl;
 impl *pimpl; // impl にもメンバー変数いっぱい
};
全てのメンバー変数の複製を作る場合、
pimpl は特別な処理をしなきゃいけなくなりますよね。
そこでコピーコンストラクタと代入演算子を独自に定義したら、
丸々コピーしてくれるデフォルトのコピーコンストラクタと代入演算子が当然使えなくなる訳ですよ。
そうなると、Xの メンバー変数いっぱい をチマチマ代入しなきゃいけなくなるんで、
楽かつシンプルな方法はないかと考えていまして。
memcpyだとメンバーが単純なビットコピーじゃない場合に不具合が生じるし…

47 名前:デフォルトの名無しさん :2006/06/06(火) 01:08:09
君はプログラム書かない方がいい。

48 名前:デフォルトの名無しさん :2006/06/06(火) 01:09:02
予想で申し訳ないんだけど、
設計が不味いとしか思えない。


49 名前:デフォルトの名無しさん :2006/06/06(火) 02:04:58
>>46
pimpl に、コピーの意味づけを加えたポインタクラスを使え。

50 名前:デフォルトの名無しさん :2006/06/06(火) 02:06:16
>>35,41
ハンドルの使用と参照型の使い方は関係ないだろ。初心者を混乱させるな。

51 名前:デフォルトの名無しさん :2006/06/06(火) 02:15:03
ところで、
C++ってjavaと比較してお仕事の絶対量って少ないのでしょうか?
求人を見るとjavaやphpばかりで・・・。


52 名前:デフォルトの名無しさん :2006/06/06(火) 02:21:16
>>51
そんなことを知ってどうする?調査、統計しないと結論は出ないしね。
話を続けると C++ の話題から遠ざかるだろうから、これ以上は他所でやってくれ。

53 名前:デフォルトの名無しさん :2006/06/06(火) 02:25:47
C++が使えるなら、JavaやPHPの習得なんて楽でしょ
時間があれば。

54 名前:デフォルトの名無しさん :2006/06/06(火) 02:27:41
言語の習得は楽勝だろうね。
ライブラリはちと時間かかるが。

55 名前:42 :2006/06/06(火) 02:34:07
>>47,48
有りそうな例を考えたつもりですが、結構変な例でしたか。
正直、ただ単にチマチマ代入文書くのが面倒なだけです。
a = x.a; b = x.b; c = 0; d = x.d; e = x.e; f = x.f;
と書くのも見栄えがあまり良くないと思ったもので。

>>49
それしかコピーコンストラクタと代入演算子内でシンプルに書ける方法が
なさそうですよね。

ありがとう御座いました。ねます。

56 名前:デフォルトの名無しさん :2006/06/06(火) 06:00:02
>>50
C++FAQ 第2版 ローカルリファンレンスとは何か を参照。

57 名前:デフォルトの名無しさん :2006/06/06(火) 10:26:23
クラステンプレートのfriend宣言についての質問です。
あるクラステンプレートMyClass用のoperator<<をオーバーロードしたいとします。
敢えてfriend宣言のtemplateを省略し、

template <class T>
class MyClass {
...
friend std::ostream& operator<<(std::ostream&, const MyClass&);
};

template <class T>
std::ostream& operator<<(std::ostream& os, const MyClass<T>& m) { ... }

の形にすると「Undefined reference」となりコンパイルできませんが、

std::ostream& operator<<(std::ostream&, const MyClass<int>&) { ... }

のように明示的な関数を定義しておけば正常にコンパイルされ、実行できます。
(non-template-friend警告は無視しています)
なぜこのような差が生じてしまうのでしょうか?

MyClass<int>のインスタンスを作った際に、MyClass<int>が実体化され、
friend std::ostream& operator<<(std::ostream&, const MyClass<int>&);
の宣言が行われるかと思っていたのですが、もし宣言が行われているならば
最初の定義でマッチしないのは不自然に思えてしまいます。
実体化のタイミングがズレているのでしょうか?

長文失礼致しました。

58 名前:デフォルトの名無しさん :2006/06/06(火) 10:39:54
template <class TT>
friend std::ostream& operator<<(std::ostream&, const MyClass<TT>&);

59 名前:デフォルトの名無しさん :2006/06/06(火) 10:54:12
Windowsプログラミングの初歩的なことについての質問なのですが、

環境:
Windows XP SP2
VC++6.0(記述はC言語)

目的:
位置を自由に変更できるモーダレスなダイアログボックスを表示したい

コード:
WinMain関数内で、

DialogBox(hInstance, "MYDIALOG", NULL, (DLGPROC)DlgProc);

と記述しています。
hInstance:アプリケーションハンドル
MYDIALOG:自分でつくったダイアログの名称
DlgProc:ダイアログプロシージャ

結果:
実行するとなぜか位置が固定でタイトルに何も表示されないダイアログボックスが表示されてしまいます。
タイトルキャプションには「ダイアログ」と入力しているのですが。
どなたかアドバイスお願いします。

60 名前:デフォルトの名無しさん :2006/06/06(火) 11:01:43
>>59
>>1を読んで

61 名前:デフォルトの名無しさん :2006/06/06(火) 11:03:58
deleteしないとmainを抜けた後もメモリリークは残るんですか?
もしnewとdeleteの途中でexitとかさせると、
それはメモリリークになりますか?

62 名前:デフォルトの名無しさん :2006/06/06(火) 11:08:07
ISO C++的には環境依存です。
Windows, UNIX, Mac OS Xはメモリリークしないです。

63 名前:デフォルトの名無しさん :2006/06/06(火) 11:31:48
>>57
こうかな?ウザイな。

template<class T>
class MyClass;

template <class T>
std::ostream& operator<<(std::ostream& os, const MyClass<T>& m);

template <class T>
class MyClass {
...
friend std::ostream& operator<< <T> (std::ostream&, const MyClass&);
};

template <class T>
std::ostream& operator<<(std::ostream& os, const MyClass<T>& m) { ... }

64 名前:デフォルトの名無しさん :2006/06/06(火) 11:39:43
>>56
なんか用語としての意味があるの?
「ローカルリファレンス」と "local reference" どちらでググっても
C++ FAQ の目次しか出てこないから、何か勘違いしてるんじゃないの?

そんな平易な言葉に見たまま以上の意味を持たせるのはやめてほしい。

65 名前:57 :2006/06/06(火) 11:49:04
>>58
言葉足らずで済みません、そうしなければいけないことは分かっているのですが、
敢えて省略した際の動作が不可解だったので質問させて頂きました。

>>63
確かにそれで通りますね…
といってもなぜそれで通るようになるのか分からず…(TT
もう少し勉強してみます。

66 名前:59 :2006/06/06(火) 11:55:04
すみませんでした

67 名前:デフォルトの名無しさん :2006/06/06(火) 11:56:55
>>65
gcc「non-template-friend警告て言うてるやん!無視すなや。もうあほかと」

68 名前:デフォルトの名無しさん :2006/06/06(火) 15:25:26
for (p = s.end( ); p != s.begin( ) && *--p == c;);

こんなコードみかけたんだけど
for文ってfor(xxx; xxx; xxx)
みたいに()の中は三つ項目がいるんじゃなかったの?
上記のコードが何をしているか説明して下さい

69 名前:デフォルトの名無しさん :2006/06/06(火) 15:28:20
>>68
3つあるじゃん。3つ目は空っぽだけど。
やってることは
for(a;b;c){} と a; while(b){c;}が等価ってことで分かるっしょ

70 名前:デフォルトの名無しさん :2006/06/06(火) 15:29:57
>>68
p という恐らくは何らかのコンテナの末尾から先頭に向かって、
全ての要素に c を代入している。

ちなみに for 文では空文が許可されている。

71 名前:デフォルトの名無しさん :2006/06/06(火) 15:30:47
> p という恐らくは何らかのコンテナの末尾から先頭に向かって、

s だったorz

72 名前:デフォルトの名無しさん :2006/06/06(火) 15:38:49
>>70
==は代入じゃなくて比較なので
cと一致しない値を見付けるまでpを逆走させてる

73 名前:68 :2006/06/06(火) 15:53:02
みんなありがとうございます
こんなforの使い方もあるんですね

すみませんあと一個聞かせて下さい

for( int i = 0; i < 3; i++) { printf("%d\n", i); }

このコードの実行順序は
1 i = 0
2 i < 3
3 printf
4 i++
5 i < 3
6 printf
7 i++
8 printf
...

であっていますか?


74 名前:68 :2006/06/06(火) 15:54:20
間違えたすみません

> 8 printf

8 i < 3

です

75 名前:デフォルトの名無しさん :2006/06/06(火) 15:59:38
>>73-74
yes

76 名前:デフォルトの名無しさん :2006/06/06(火) 16:12:52
>>70
空文じゃなくて、式がφです。

77 名前:デフォルトの名無しさん :2006/06/06(火) 23:18:51
C++やって一年以上経つのに
privateメンバ関数をオーバーライドできる事に今気づきました

VC++2005でできたんですが、これはもちろん標準C++の機能ですよね?

78 名前:デフォルトの名無しさん :2006/06/06(火) 23:28:22
>>77
もちろん標準C++のうち。
メンバをオーバーライドするに当たって、その可視性は問われない。

でも仮想関数の場合は、そもそも仮想関数をprivateにするのは、どうかとは思うけど。

79 名前:デフォルトの名無しさん :2006/06/06(火) 23:37:15
>>77
出来なかったら不便この上ないでしょ。
実装部分をメソッドとしてまとめられないし

80 名前:デフォルトの名無しさん :2006/06/06(火) 23:41:07
>>78 >>79 ありがとうございます

privateメンバ関数を仮想にするのは
調べてみたところ「NVIイディオム」とやらに使用する場合があるみたいです

class A{
private:
virtual void Print(){ std::cout << "is A";}
public:
void CallPrint(){ Print();}
};
class B :public A{
virtual void Print(){ std::cout << "is B";}
};
A* a = new B;
a->CallPrint(); // "is B"と表示

81 名前:デフォルトの名無しさん :2006/06/07(水) 00:04:40
漏れは class の中身書くときに、先に public 書いて後で protected、private と
続く感じなんだけど、みんなはどうしてる?
>80 は逆みたいだね。やっぱりデフォルトが private だから?

82 名前:デフォルトの名無しさん :2006/06/07(水) 00:45:50
>>81
どうでもいい話題を持ち込むなバカ

83 名前:デフォルトの名無しさん :2006/06/07(水) 01:44:45
>>81
それは宗教戦争になるからここでは触れない方が吉。

84 名前:81 :2006/06/07(水) 01:57:51
すまん去るよ

85 名前:デフォルトの名無しさん :2006/06/07(水) 02:25:31
>>83
どういう順番で実装するかは、お好みだし、宗教戦争になるかもしれんが
どう考えても public が先に決まるだろ?
でないと class になってる意味が無いような気がする。

86 名前:デフォルトの名無しさん :2006/06/07(水) 02:26:33
だから話を蒸し返すなよ馬鹿w

87 名前:デフォルトの名無しさん :2006/06/07(水) 12:08:29
>>39
int i = 0;
int j = 1;

int & r = i;

r = j;
r = 2;

としたときに、i, j それぞれに何が入るか分かっていれば、

> それとリファレンスはポインタよりも束縛が強い
> とのことですが、束縛が強いとはどういう意味でしょうか?

という言葉は出てこない気がする。

88 名前:デフォルトの名無しさん :2006/06/07(水) 12:45:31
>>39
ハンドルは忘れろ。

89 名前:デフォルトの名無しさん :2006/06/07(水) 12:46:56
>>39
> 束縛が強いとはどういう意味でしょうか?

初期化時にどこを参照するか決められて、以後変えることはできない。
初期化しないことも許されない。

90 名前:デフォルトの名無しさん :2006/06/07(水) 14:11:18
つーかローカルかどうかに限らず、参照はハンドルを表現するための手段なんだから
別に間違ってはいないだろ

91 名前:68 :2006/06/07(水) 15:23:40
>>76
φってラムダ式のことをいっているの?

92 名前:デフォルトの名無しさん :2006/06/07(水) 15:31:38
φ = 空

93 名前:68 :2006/06/07(水) 15:35:27
>>92
空文だと文自体がないことになっちゃうから
空文じゃなくて空の式だといっているのですね

94 名前:デフォルトの名無しさん :2006/06/07(水) 16:49:31
forの()の中の";"は空文(= ;)の";"とは全然違うから。

for (式opt; 式opt; 式opt) 式

だからさ。最後の"式opt"の後ろには";"ないし。




95 名前:デフォルトの名無しさん :2006/06/07(水) 17:11:36
何とんちんかんな突っ込みしてるの?

96 名前:デフォルトの名無しさん :2006/06/07(水) 17:30:58
>>94
しかもその中身もちょっと違う。

for (int i = 0;のように、ここで変数宣言できるよう、正しくはこうだ。

繰り返し文:
    for ( for初期化文 条件opt ; 式 opt ) 文

for初期化文:
    式文
    単純宣言

97 名前:デフォルトの名無しさん :2006/06/07(水) 20:39:25
>>96
for初期化文:
式文
単純宣言

これの意味がわからないです

98 名前:デフォルトの名無しさん :2006/06/07(水) 21:16:27
擬似BNF記法かね

99 名前:デフォルトの名無しさん :2006/06/07(水) 21:39:20
>>90
ハンドルは忘れろ。

100 名前:デフォルトの名無しさん :2006/06/07(水) 21:55:57
>>98
C/C++の規格ではそういう記法を使っている。

101 名前:デフォルトの名無しさん :2006/06/07(水) 22:58:34
コンパイラによって通ったり通らなかったりするコードに困ってる。
C++の規格ではどっちが正しいのか教えてくれ。

std::ofstream fout;
std::ostream *pout = fout ? &fout : &std::cout;
std::ostream &out = fout ? fout : std::cout;

gcc3.4.4だと両方通る。
VC8だと上が通って下が通らない。エラーメッセージはこんなん。

エラー1error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : private メンバ (クラス 'std::basic_ios<_Elem,_Traits>' で宣言されている) にアクセスできません。c:\program files\microsoft visual studio 8\vc\include\ostream581

なぜかヘッダーにエラーがあることになってるんだけど、&outの行を
コメントアウトするとコンパイル通るからこの行のせいだと思うんだ。

C++の規格的にはどっちが正しい?

102 名前:デフォルトの名無しさん :2006/06/07(水) 23:04:10
とりあえず、条件式にfoutを使うのはどうかと思うがどうか?

103 名前:デフォルトの名無しさん :2006/06/07(水) 23:06:59
>>101
これはVC8でもコンパイルできた。
std::ostream &out = fout ? static_cast<std::ostream&>(fout) : std::cout;

条件演算子の結果の型を決める手順はきちんと規格書を呼んだわけではないが、結構複雑だと聞いたことがある。


104 名前:デフォルトの名無しさん :2006/06/08(木) 00:31:06
>>102
アホですね

105 名前:デフォルトの名無しさん :2006/06/08(木) 01:05:15
>>103
ありがとう。castで通るとはね。
エラーメッセージとの関連性がまだ見えなくて気になるけど
gccでも通ったからひとまずこれで回避させてもらうよ。

106 名前:デフォルトの名無しさん :2006/06/08(木) 17:17:40
typedef WCHAR TCHAR , *PTCHAR ;

typedefが型の別名を定義するというのは知っていますが、
↑のはどういう意味なのでしょうか?


107 名前:デフォルトの名無しさん :2006/06/08(木) 17:27:15
>>106
TCHAR = WCHAR
PTCHAR = WCHAR *

108 名前:106 :2006/06/08(木) 17:40:25
>>107
さんくす!!!!

109 名前:デフォルトの名無しさん :2006/06/08(木) 17:54:24
typedef std::multimap<std::string,std::string> Header;
Header.insert( make_pair(key, value) );

cygwin上のgcc version 3.4.4では通ったんだが
SolarisのCC 5.8では

std::multimap<std::string, std::string, std::less<std::string>, std::allocator<std::pair<const std::string, std::string>>>::insert(std::pair<std::string, std::string>) と一致するものがありません.

て言われる。なんでだろ?

110 名前:デフォルトの名無しさん :2006/06/08(木) 18:38:07
とりあえずHeaderは型名な訳だが

111 名前:デフォルトの名無しさん :2006/06/08(木) 20:13:55
int main(int argc, char **argv)
{

}

Linuxのcのサンプルプログラムでよく
上のみたいな**argvってのを見かけるんですが
どうしてポインタのポインタになっているんですか?


112 名前:デフォルトの名無しさん :2006/06/08(木) 20:16:30
>>111
そういうあほな質問は別スレでやってくれないか

113 名前:デフォルトの名無しさん :2006/06/08(木) 21:21:16
>>111
argvの利用方法を理解していればおのずと分かる。

114 名前:デフォルトの名無しさん :2006/06/08(木) 21:28:32
>>111
・・・・・・

115 名前:デフォルトの名無しさん :2006/06/08(木) 23:50:14
>>>111
ワラタw

116 名前:デフォルトの名無しさん :2006/06/08(木) 23:56:18
この時期学校の授業でプログラミングやりだす学生が多いんだろうな

117 名前:デフォルトの名無しさん :2006/06/09(金) 00:08:02
最近mainの引数の使い方覚えたような奴が釣られてるとしか思えない

118 名前:デフォルトの名無しさん :2006/06/09(金) 00:27:36
その通りですが何か?

119 名前:デフォルトの名無しさん :2006/06/09(金) 00:42:16
>>111
int main(int argc, char *argv[])
こうすると分かりやすいかもしれない(厳密に同じ意味である)
ようするに文字列の集まりを渡そうとしている
不気味なインターフェイスはCがそうだからだろう

120 名前:デフォルトの名無しさん :2006/06/09(金) 03:48:46
ただいま〜今日は1日中眠かったよ…
解答うpしますね。
ちなみに環境はxyzzyです。

(defun _reverse (x &optional (y nil))
(if (null x)
y
(_reverse (rest x) (cons (first x) y))))

(defun _append (x y)
(if (null x)
y
(cons (first x) (_append (rest x) y))))

(defun _length (x &optional (y 0))
(if (null x)
y
(_length (rest x) (+ y 1))))

121 名前:デフォルトの名無しさん :2006/06/09(金) 03:56:53
質問なんですが、C++でワイド文字を使用するときwchar_tを使うということまではわかったのですが、
ワイド文字を格納して、それをcoutで表示させようとしてもアドレスみたいなのが出て、
ちゃんと表示されません。

C++では、wchar_tを使って格納した文字をどのようにしたら画面に表示させられるのでしょうか?

122 名前:デフォルトの名無しさん :2006/06/09(金) 03:57:29
>>121 wcout

123 名前:・∀・)っ-○◎● ◆toBASh.... :2006/06/09(金) 04:00:38
std::wcout << L"ワイド文字はwcoutに吐こうね" << std::endl;
std::wcout << L"ちなみにwendlはねーよwwwwww" << std::endl;

124 名前:・∀・)っ-○◎● ◆toBASh.... :2006/06/09(金) 04:06:00
あと、どうしても化ける場合のおまじないとか。

std::wcout.imbue(std::locale("japanese");

125 名前:デフォルトの名無しさん :2006/06/09(金) 04:12:20
>>122

C:\Documents and Settings\Owner\デスクトップ\VC++\Sample_program\練習用\resnnsyuuu.cpp(14) : error C2065: 'wcout' : 定義されていない識別子です。
C:\Documents and Settings\Owner\デスクトップ\VC++\Sample_program\練習用\resnnsyuuu.cpp(14) : error C2297: '<<' : 不正な右オペランドです。

というエラーが出ました。どうしたらいいでしょうか?

126 名前:デフォルトの名無しさん :2006/06/09(金) 04:17:12
>>125
コンパイラが wcout をサポートしているかどうか調べるといい。
このスレで聞いてもスレ違いだから気をつけて。

127 名前:デフォルトの名無しさん :2006/06/09(金) 04:22:41
>>126
ありがとうございました!!

128 名前:111 :2006/06/09(金) 08:08:09
こ、こんな屈辱を受けたのは、はじめてだ!
おまえらもうゆるさないぞー

129 名前:デフォルトの名無しさん :2006/06/09(金) 08:39:51
STLに関して「直交性が高い」とかいいますが
どういう意味ですか?

130 名前:デフォルトの名無しさん :2006/06/09(金) 08:41:46
ぐぐったら一発だった失礼しました

131 名前:デフォルトの名無しさん :2006/06/09(金) 10:47:08
>>110
HeaderってBoostの?非標準なライブラリは使ってないぞ
まあこれは仮名なんで実際のソースはこの名前じゃない。
なんとなく原因は分かってきたので確信ついたら書くお。

132 名前:≠110 :2006/06/09(金) 11:06:04
>>131
いやだから、>109の1行目はHeaderを型宣言しているよな。
で、2行目は型のメンバを呼ぼうとしているよな。
例えばこうなら納得いくんだがな。
typedef std::multimap<std::string,std::string> Header;
Header header;
header.insert( make_pair(key, value) );


133 名前:109 :2006/06/09(金) 11:22:36
>>132
あーそいうことね
すまそ、書き方不足でした。

ちなみに解決。
下の書き方だとgccでもCCでも通った。

typedef std::multimap<std::string,std::string> Header;
typedef Header::value_type Entry;
Header header;
header.insert( Entry(key, value) );

pairじゃなくてvalue_typeを使うのが標準ってことなのかね

134 名前:デフォルトの名無しさん :2006/06/09(金) 11:27:34
『12:34:56』と入力した時、
hh=12
mm=34
ss=56
という様に代入するプログラムはどうやって書くんですか?

135 名前:デフォルトの名無しさん :2006/06/09(金) 11:32:15
>>133
value_type は pair<string const, string> なんだが、これは
pair<string, string> から暗黙に変換できるはず。
この変換には pair のコンストラクタテンプレートが使われるんだが、
CC はそこ(メンバ関数テンプレート?)らへんで失敗してるんだろう。

136 名前:デフォルトの名無しさん :2006/06/09(金) 11:34:19
>>134
まず自分で書いて、問題があればその問題を相談しろ。

137 名前:デフォルトの名無しさん :2006/06/09(金) 12:03:43
>>134
俺はエディタ使って書くが


138 名前:デフォルトの名無しさん :2006/06/09(金) 12:06:22
がんばってedlinで書くw

139 名前:デフォルトの名無しさん :2006/06/09(金) 13:24:19
c++で、intでは入りきれない変数のとき、
int64_tを使っているんですが、これでよいのですか?
long long とかを使うべきなんですか?


140 名前:デフォルトの名無しさん :2006/06/09(金) 13:48:33 ?#
多倍長整数クラスを使う

141 名前:デフォルトの名無しさん :2006/06/09(金) 16:23:56
MFCで自作簡易HTMLブラウザって出来ますか?????
教えていただけると助かります。。。。。

142 名前:デフォルトの名無しさん :2006/06/09(金) 16:26:12
>>141
出来る

143 名前:デフォルトの名無しさん :2006/06/09(金) 16:27:05
>>139
そんなのどのぐらいの制度を要求されてるのかによるじゃんよ。
値が対数的に分布するような変数ならlong long使うより浮動小数点数にして係数調整したほうがいい。

>>141
IEの機能を読み込む形でかなり簡単に作れた気がする。

144 名前:デフォルトの名無しさん :2006/06/09(金) 16:28:04
しまった
対数×→指数○

145 名前:デフォルトの名無しさん :2006/06/09(金) 16:32:28

IEに依存する<基本クラスCHtml view>を用いたものは出来たのですが、
自作でのHTMLレンダリングエンジンを作りたいと考えています。

146 名前:デフォルトの名無しさん :2006/06/09(金) 16:36:25
windowsで描画できるもんは何だって作ることは可能だ。

147 名前:デフォルトの名無しさん :2006/06/09(金) 16:51:06
方法教えて(泣)
方法を求む!!!!!

148 名前:デフォルトの名無しさん :2006/06/09(金) 16:53:17 ?#
>>147
どうにかしてコネクションを張る
 ↓
HTTPで必要な情報を取り出す
 ↓
取り出した情報を適切に解釈する
 ↓
解釈した情報を元に描画する

149 名前:デフォルトの名無しさん :2006/06/09(金) 16:59:24
ありがとう御座います。
難しそうだけどプログラムを組みたいと思います。


150 名前:デフォルトの名無しさん :2006/06/09(金) 17:23:14
(´-`).。oO(なにがわかったのだろう・・・無理なのだろう)

151 名前:デフォルトの名無しさん :2006/06/09(金) 19:49:04
クラス内部に定義されたクラスを前方で参照することって出来ないんでしたっけ?

void func(struct A::B& x) { ... } ←ここをどうにかしたい

struct A
{
 struct B { ... };
};

152 名前:デフォルトの名無しさん :2006/06/09(金) 19:51:22
>>150
全くそのとーり〜
意味が分からんが・・・とりあえず流した。

153 名前:デフォルトの名無しさん :2006/06/09(金) 20:12:36
class A :public hoge<A>
{
voif foo();
};

みたいな記述を見かけるのですが、

1 コンパイラはどういう順番でコレを解釈するんでしょうか?
(Aの親クラスがhoge<A>で、Aの定義は・・ と無限ループしないか?)
2 どういう用途に使われるんでしょうか
3 この技法は一般的に何と呼ばれるんしょうか

解説したサイト等を探してるのですが、検索ワードが思いつきません・・・

154 名前:デフォルトの名無しさん :2006/06/09(金) 20:24:39
これのことかな?
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-selfref-template.html

155 名前:デフォルトの名無しさん :2006/06/09(金) 20:27:12
>>153
1. とりあえず、hoge クラステンプレートの定義を読む。
  この時点ではコンパイルされない。
2. とりあえず、A の定義を読む。まだコンパイルされない。

3. コンパイル中に A a; みたいな文が出てきて、
  A が実際に必要な段階になったら、A と hoge<A> がコンパイルされる。
  hoge の定義も、A の定義もすでに 1, 2 で読んであるから、
  コンパイルする際も問題ない。


156 名前:デフォルトの名無しさん :2006/06/09(金) 20:28:20
っと、>>155 の 1,2,3 は、>>153 の 1,2,3 に対応するんじゃなくて、
単純に評価の流れをおっただけの番号ね。


157 名前:デフォルトの名無しさん :2006/06/09(金) 20:29:15
>>153
それを表す言葉はCRTP (Curiously Recurring Template Pattern)。

158 名前:デフォルトの名無しさん :2006/06/09(金) 22:27:10
不思議な再帰の雛形様式ね
不再雛式と覚えればオケー

159 名前:デフォルトの名無しさん :2006/06/09(金) 22:42:38
なのー

160 名前:デフォルトの名無しさん :2006/06/09(金) 23:06:14
よし。「なのー」で俺の頭にインプットしたぞ。

161 名前:デフォルトの名無しさん :2006/06/09(金) 23:18:06
自己言及的テンプレート

162 名前:デフォルトの名無しさん :2006/06/10(土) 01:12:58
自慰式至射精テンプレート

163 名前:・∀・)っ-○◎● ◆toBASh.... :2006/06/10(土) 02:23:18
Jane DoeのテキストビューコントロールをMFCとかWTLに移植してくれたら神認定>>145

164 名前:デフォルトの名無しさん :2006/06/10(土) 03:21:19
関数呼び出し演算子のオーバーロードをやってみようと思ってるんだけど、
なぜかコンパイルエラー・・・
どうしてエラーになるのかわからない・・・
誰か助けてください・・・・

#include<iostream>
using namespace std;

struct myClass{
myClass(){}
int operator()(){
return 9;
}
};

int main(){
myClass m();
int i;
i=m();
cout<<i<<endl;
}

これで実行すれば9が出力されるプログラムのつもりなんだけど、
なぜかコンパイルできない。
i=m();
の行で、error: cannot convert `myClass' to `int' in assignment
っていうエラーがでる。
m()でmyClassのoperator()が呼ばれてintの値を返してるつもりなのに。
なんで?

165 名前:デフォルトの名無しさん :2006/06/10(土) 03:33:10
mainの最初の行が関数宣言だと思われている。
-myClass m();
+myClass m;

166 名前:デフォルトの名無しさん :2006/06/10(土) 03:41:17
>>165
なるほどdクス!

てことは、こういう場合は無引数のコンストラクタを呼ぶときは()をつけちゃいけないってことなのかな?

167 名前:デフォルトの名無しさん :2006/06/10(土) 03:46:36
>>166
Exactly!

168 名前:デフォルトの名無しさん :2006/06/10(土) 06:40:13
質問です
次のようなコードを書きました

void foo(){
 try{
  (処理1)
 }catch(bad_alloc){
  (処理2)
 }catch(...){
  (処理3)
 }
}

処理1がなぜか失敗します。
その時何の例外が出ているのかよく分からず、
とりあえずbad_allocかなと思って例外を捕まえようとしたのですが、
どうもbad_allocでは無いようです
何の例外が出ているのか調べるにはどうすればよいのでしょうか
ご教示願います

169 名前:デフォルトの名無しさん :2006/06/10(土) 07:11:23
>>168
もし、その例外がSTLの例外だとするならば、
すべてのSTLの例外はstd::exceptionを継承しているから、
次のようにキャッチすればよい。

catch(std::excepption & e)


ここから環境依存の話になるけど、
VC++を使っているなら、SEHをキャッチしてしまったというのもありえる話。
VC8からは、最適化の関係で、
デフォルトではキャッチされなくなったけど。

170 名前:デフォルトの名無しさん :2006/06/10(土) 10:12:49
>>151 できないよ。

171 名前:デフォルトの名無しさん :2006/06/10(土) 10:24:14
あまり教えんなよ
164,166は悪戯をしたいだけの厨なのミエミエなんだから

172 名前:151 :2006/06/10(土) 12:04:01
>>170
さんきゅ

173 名前:153 :2006/06/10(土) 17:02:10
>>154-162
質問に答えていただき、ありがとうございました

キーワードは抑えたので、詳しい事はWebの海で探してきます

174 名前:デフォルトの名無しさん :2006/06/10(土) 17:20:14
http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern

175 名前:168 :2006/06/10(土) 17:29:22
>>169
ありがとうございます
std:exceptionでぐぐって勉強してみます

176 名前:前スレ860 :2006/06/10(土) 20:24:55
うーむ・・・実際はstdio.hだけじゃないんですよね・・・stdioでもどれがくるのかわからない。
fopen()かもしれないし、_wcsicmp()かもしれない。
何のヘッダが来ても何とかできる方法はないでしょうか・・・???


177 名前:デフォルトの名無しさん :2006/06/10(土) 21:15:10
>>176
なんでそんなアホなことがしたいんだ?

178 名前:デフォルトの名無しさん :2006/06/12(月) 01:20:05
プログラムの最初で変数をstatic宣言しとくと何かと便利
だとどこかで読みました。
しかし、どこが便利なのかわかりません。
例えばプログラムの最初の方で、

int i;

とするのと

static int i;

とするのは何が違ってくるのでしょうか?

179 名前:デフォルトの名無しさん :2006/06/12(月) 01:38:32
>>178
static の意味は使う場所でいろいろ変わるから、それだけじゃ比較できない。

180 名前:デフォルトの名無しさん :2006/06/12(月) 02:13:31
static変数は便利どころか厄介な代物なので可能な限り使わないこと。
使わなければいけない理由がある場合以外には。

181 名前:デフォルトの名無しさん :2006/06/12(月) 02:26:43
外部からexternされることを禁止するという意味では望ましいが
autoで済むのなら済ましないさいなというところ。

182 名前:デフォルトの名無しさん :2006/06/12(月) 03:15:26
コンパイル時の依存性を減らすために
templateメソッドを実装ファイル内に記述
したいのですが、何か方法はありますか?

183 名前:デフォルトの名無しさん :2006/06/12(月) 03:16:41
>>182
exportをサポートしたC++コンパイラを使用する。

184 名前:デフォルトの名無しさん :2006/06/12(月) 06:11:35
>コンパイル時の依存性を減らすために
>templateメソッドを実装ファイル内に記述
>したい
まずこの前提条件が間違ってるから無理。
コンパイル時に依存できるからTemplateを使う。
おそらくTemplateを使う場所を間違ってる。

185 名前:178 :2006/06/12(月) 08:41:13
どうもありがとうございます

>>179
もしよかったら使うメリットを具体例を挙げて
教えてもらいたいです
>>180
その使わなければならない理由を知りたいです
>>181
そういう効果があったんですね


186 名前:デフォルトの名無しさん :2006/06/12(月) 08:49:55
>>185
今知らないのなら、使わなければならない理由なんて知らない方がいいよ。
そもそもここは初心者に手取り足取り教えるスレじゃないんで、どうしても知りたければ
適切なスレに逝っとくれ。

187 名前:デフォルトの名無しさん :2006/06/12(月) 09:48:35
「何かと便利」って,なんだその理由w

188 名前:デフォルトの名無しさん :2006/06/12(月) 09:59:23
どういうものかも知らないのに、
・「何かと便利」と聞いたが何が便利か分からない。
その上、
・これってどういう意味ですか?
それに対して、文脈によって違うからと答えられると、
・使うメリットを具体例を挙げて教えてもらいたいです。

まともな人間とは思えない。

189 名前:デフォルトの名無しさん :2006/06/12(月) 10:11:52
static 変数の役割が知りたいなら入門書を読め。

190 名前:デフォルトの名無しさん :2006/06/12(月) 11:27:05
質問させてください。
template <class data_t> class list {
protected:
data_t value;
list *next;
public:
virtual data_t retrieve() = 0; };

template <class data_t> data_t stack<data_t>::retrieve() {
data_t temp;
list<data_t> *del;

temp = next->value; ▲
del = next; ●
next = del->next; ▲ }
▲の部分で、protected のメンバにアクセスできないという、コンパイルエラーになります。
同じ protected メンバの next にはアクセスできて、next->value にはアクセスできません。
何故でしょうか?


191 名前:178 :2006/06/12(月) 11:35:52
スレ違いでしたか失敬

関数中で変数をstatic宣言するなら意味がわかるんだけど
そのとき読んだやつでは
static int i;

int main(void) {
...
}

みたいにmainの前のグローバルスコープでstatic宣言されてて、
そこに宣言するなら別にstaticつけなくていいじゃんと思ってのでした

で、このことの意味は別のソースからextern宣言されるのを防ぐため
ということですね。どうもありがとうございました

192 名前:デフォルトの名無しさん :2006/06/12(月) 11:49:26
>>190
ISO/IEC 11.5 Protected member access
: the access must be through a pointer to, reference to, or object of the derived class itself

193 名前:デフォルトの名無しさん :2006/06/12(月) 16:01:58
今行列計算をしようとしているのですが、
標準の行列ライブラリだと0行0列から始まってしまい、
なおかつn行n列という定義ができないので不便で
(というか計算不能で)しょうがありません。
これを解決するインクルードファイル等をご存知でしたら
教えてください。よろしくお願いします。

194 名前:デフォルトの名無しさん :2006/06/12(月) 16:05:37
標準の行列ライブラリなんてねーよ。
boostでも使えば?

195 名前:デフォルトの名無しさん :2006/06/12(月) 17:14:49
>>190
インスタンスが別だから。
protectedは継承先から継承元へのアクセス指定。

196 名前:デフォルトの名無しさん :2006/06/12(月) 17:55:03
#define RETURNCODE "\n" //windowsでは"\r\n"

なんて改行コードの違いを上みたいに書く人が意識するんじゃなくて
システムに判断させたいんだけど何かいい方法ないかなあ?
#ifdefとかよりもっと簡単な方法で。

197 名前:デフォルトの名無しさん :2006/06/12(月) 18:06:37
>190
もう一つかぶせると、
自分(のクラス)の一部としてのみアクセスできる。
無理すればアクセスすることも出来るけど、お薦めはしない。

198 名前:デフォルトの名無しさん :2006/06/12(月) 18:18:54
>>196
stdioのtext modeなら "\n"で統一されてるけどな

199 名前:デフォルトの名無しさん :2006/06/12(月) 20:20:15
>>196
何だかんだ言って状況によるからな。

UNIXやMacは、text fileでは独自のやり方だけど、
networkなtext streamでは(例えばHTTP)共通の規則だから。

Windowsはそういう意味では常に\r\nでいいんだけど、
今度はfileを読み書きする時には、textかbinaryか明示し忘れるとまずいし。
# ISO C/C++的には明示しないのが悪いわけだが。

というわけであんまりいい方法、しかも一般的な方法はありませんよ。

200 名前:デフォルトの名無しさん :2006/06/12(月) 21:13:48
text modeのやる気のないソースをみると
自前でやった方がいい気にはなるな
あれだけのためにどれだけパフォーマンス落ちてるんだと

201 名前:デフォルトの名無しさん :2006/06/12(月) 21:21:19
テキストモードなんてそもそもパフォーマンス悪いの前提でしか使わん

202 名前:デフォルトの名無しさん :2006/06/12(月) 21:46:14
C++はパフォーマンスのために使うのにな

203 名前:デフォルトの名無しさん :2006/06/12(月) 21:57:39
>>182
明示的実体化とか


204 名前:デフォルトの名無しさん :2006/06/13(火) 00:09:43
Winで改行コードがCRLFになった経緯って何だっけ?


205 名前:デフォルトの名無しさん :2006/06/13(火) 00:10:48
タイプライターを模したからじゃないの?

206 名前:デフォルトの名無しさん :2006/06/13(火) 00:38:50
>>204
MS-DOSから継承したから。
テキストファイル末尾のEOF文字は流石に継承しなかったが。

207 名前:デフォルトの名無しさん :2006/06/13(火) 00:46:17
CP/Mはどうだったの?


208 名前:デフォルトの名無しさん :2006/06/13(火) 00:51:27
CP/Mは改行はCRLF、テキストファイル末尾は128バイト単位のレコードを埋め尽くすまでEOFコード(0x1a)。

209 名前:デフォルトの名無しさん :2006/06/13(火) 00:54:56
>>208
>テキストファイル末尾は128バイト単位のレコードを埋め尽くすまでEOFコード(0x1a)
これはなかなか面白いですね

CP/Mの改行コードは何に由来するんでしょうか?


210 名前:デフォルトの名無しさん :2006/06/13(火) 00:56:50
あとMacは昔CRだったと記憶してますが
OSXでもそれは変わらないのでしょうか?

あとCRにしたのはなんでなんでしょね?


211 名前:デフォルトの名無しさん :2006/06/13(火) 00:57:24
いい加減スレ違いなので自分でしらべてください

212 名前:デフォルトの名無しさん :2006/06/13(火) 01:00:23
>>210
なんでかは知らんが
おかげでファイル読み込みのときに
LF, CRLF, CRの3種類のシーケンスのどれがきても
ひとつの改行と認識するコードを書かねばならなくなったりしてたよな
まあ今でもHTTPで引っ張って来るときはそんな感じだが

213 名前:デフォルトの名無しさん :2006/06/13(火) 01:03:54
>>210
普段は CR で、ターミナルで UNIX コマンド使ってると LF 。

214 名前:デフォルトの名無しさん :2006/06/13(火) 04:02:01
>>204
もともとASCIIでは、CRLFが行末。復帰(0カラム)+改行(次の行)。
^D(0x04)がEOT(End of Transfer)。(UNIXは端末からデータ終了に^Dはそのため)

UNIXの行末が、LFだけなのは、その方がプログラミングが簡単だから、
AT&Tベル研の人たちがそうした。

Macの行末(^M)は謎。CP/M, MS-DOSのテキストファイル末端(^Z)も謎。

215 名前:デフォルトの名無しさん :2006/06/13(火) 04:06:31
AT&Tにいるようなできる人間でさえも、
プログラミングの煩雑さを嫌ってLFだけにしたのか。

なんだか希望が沸いてきた。

216 名前:デフォルトの名無しさん :2006/06/13(火) 05:36:29
テレタイプとかテレックスの仕様ではなかったか?
印字位置が行末までいったり行送りで、
自動的で印字位置が先頭に戻り、1行改行したような記憶が...
詳しい人教えて。

217 名前:デフォルトの名無しさん :2006/06/13(火) 06:14:18
^Z(EOF)はファイルサイズを管理していなかったファイルシステム上で、
クラスタ途中にあるファイルの終端を記録するためのもの。

218 名前:デフォルトの名無しさん :2006/06/13(火) 08:45:52
^Z(\032,0x1A)は、
ASCIIではSUB(substitute character)なのに、
何故かCP/Mは^D/EOTを使わずに^Zにした…

219 名前:デフォルトの名無しさん :2006/06/13(火) 10:44:29
^ZはCP/Mのファイル終端用で
(CP/Mのファイルシステムはクラスタ数しか管理していない)
MS-DOS初期はそれを引き継いだものの
FATファイルシステムでファイルサイズがバイト単位で管理できるようになったため
^Zは不要になったけどな
CP/Mとの互換性のために残ってたけど

220 名前:デフォルトの名無しさん :2006/06/13(火) 12:29:09
いきなりで不躾ですが処理がどうしても思いつかずご相談させてください。
ユーザー関数の戻り値が帰ってくるまでの時間がランダムの
場合、その戻ってくる時間分だけ待機させるのってどうしたらいいでしょう?

CheckISSError :ユーザー関数

for( i = 0 ; i < 15 ; i++){
 iRet = CheckISSError( i );
 if(iRet < 0){
  エラーの場合の処理
 }
 ::Sleep(700);
}

while文でぐるぐる回すのもおかしいですし。
現状では ::Sleep(700); をいれることでもたつきますが
正常に動作してます。

221 名前:デフォルトの名無しさん :2006/06/13(火) 12:32:05
>>220
ユーザ関数が別スレッドで動作してるなら、
WaitForSingleObjectを使うといいんじゃね。
というかスレ違い。

222 名前:デフォルトの名無しさん :2006/06/13(火) 12:35:46
>>221
スレ違い申し訳ありませんでした。

またスレ違いにもかかわらずご教授ありがとうございます。
早速試してみます。
ありがとうございました。

223 名前:デフォルトの名無しさん :2006/06/13(火) 12:42:54
参照で入出力するvectorを作りたいのですが、下のプログラムではまずいでしょうか。

template <class T> class myvector {
vector<T*> value;
public:
myvector() {}
void add( const T& in ){ value.push_back( &in ); }
T& get( const int& n ){ return *(value.at(n)); }
};

int main(){
myvector<string> vec();
string s("hoge");
vec.add( s );
}

これを実行するとmain()の最後のaddのところで

request for member `add' in `vec', which is of
non-aggregate type `myvector<std::string> ()()'

のエラーが出ます。
どなたか教えてくれませんか。

224 名前:デフォルトの名無しさん :2006/06/13(火) 12:47:50
>myvector<string> vec();
これが関数宣言とみなされているんだろう。

225 名前:デフォルトの名無しさん :2006/06/13(火) 12:50:55
>>223
myvector<string> vec();
って関数宣言になってる気がするんだが

226 名前:222 :2006/06/13(火) 12:59:13
>>224,225
どうもです。まだ慣れないもので。

その後 add() の引数を const T& から T& に変えたら
正常に動きました。ありがとうございます。


227 名前:デフォルトの名無しさん :2006/06/13(火) 13:06:54
>>226
本当に関数宣言のままで動いたのか?
ともあれ add(const T& a)の中の vector<T*>.push_back(&a)は
constポインタは非constポインタには暗黙変換できないので
当然エラーになる。

228 名前:222 :2006/06/13(火) 13:31:29
>>227
いえ言い方が悪かったです。
myvector<string> vec;
に直しました。

229 名前:デフォルトの名無しさん :2006/06/13(火) 15:10:07
別のところで質問し、スレ違いと知りこちらにやってまいりました。
ユーザー関数の戻り値が帰ってくるまでの時間がランダムの
場合、その戻ってくる時間分だけ待機させるのってどうしたらいいでしょう?

CheckISSError :ユーザー関数

for( i = 0 ; i < 15 ; i++){
 iRet = CheckISSError( i );
 if(iRet < 0){
  エラーの場合の処理
 }
 ::Sleep(700);
}

現状では ::Sleep(700); をいれることでもたつきますが正常に動作してます。
WaitForSingleObjectを使用すればいいのでは?とご教授頂いたのですが
どのように利用すればいいのかもわからない状態です。
何方かご存知の方 ご教授願えませんでしょうか?

230 名前:デフォルトの名無しさん :2006/06/13(火) 15:10:38
すみません。書くところまちがえました。
申し訳ない

231 名前:デフォルトの名無しさん :2006/06/14(水) 00:37:58
あるlibraryを使用しているんですが、
そのlibraryのclassは全てObjectというclassから派生したもので、
どのclassにもClone()が用意されています。
これらのclassをmemberに含むような自前のMyClass : public Objectを作る場合、
MyClassにもやはりClone()を用意してやって、
MyClassの(Objejctを継承している)memberは全てポインタにしてやって、
MyClass::Clone()の内部はそれぞれのclassのClone()を使用して複製して行くのが一般的でしょうか。
それとも、単にMyClass::Clone()の中ではそれぞれのclassのcopy constructorを使って、
複製を行うのがいいものなのでしょうか。

場合によって変わる、というものなのかも知れませんが、
指針があれば教えて下さい。

232 名前:デフォルトの名無しさん :2006/06/14(水) 00:47:26
そのClone()の実装が、new コピーコンストラクタと同じかどうか調べれば?

同じなら、MyClass::Clone()をコピーコンストラクタで実装すればよいし、
違うなら、メンバのClone()を律儀に呼び出す必要がある。

でも、そもそも、MyClass::Clone()を実装する必要が本当にあるの?

233 名前:231 :2006/06/14(水) 01:45:40
>>232
Clone()の実装は、内部でsaveとloadをしているようでした。
Object::Clone()のみが実装されていて、
派生classは全てObject::Clone()を利用しているようです。
なので、MyClass::Clone()を自分で書く必要はないみたいです。
# そこらへんが複雑でちゃんと読めてないんですが。
# 派生classの.hと.cxxとは別に、saveとloadを実装させるためのtoolがある。

ここです。
ttp://root.cern.ch/root/html/TObject.html

派生classのoperator=とかは、全て内部でCopy()を呼び出している。
# Clone()がsaveとloadから複製する関数で、Copy()はmemberを逐一複製している。
# このClone()とCopy()が両方ある理由も分かっていないんですが。

>でも、そもそも、MyClass::Clone()を実装する必要が本当にあるの?
これってのは、castまわりでClone()が必要な状況になれば実装すれば良いという事でしょうか?
使われる可能性がないうちは、特に実装しなくてよいということ?

classのmemberをポインタにするかどうかの判断は、
実行時にnewしたいかどうかだけで決めるものですか?

234 名前:デフォルトの名無しさん :2006/06/14(水) 02:01:16
C言語をやろうと思い導入しました
ですがうまくいきません

------ ビルド開始: プロジェクト: C, 構成: Debug Win32 ------
コンパイルしています...
Cプラス.cpp
.\Cプラス.cpp(4) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
ビルドログは "file://d:\My document\Visual Studio 2005\Projects\C\C\Debug\BuildLog.htm" に保存されました。
C - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

となってエラーになります

235 名前:デフォルトの名無しさん :2006/06/14(水) 02:04:16
>>234 お気の毒に。

236 名前:デフォルトの名無しさん :2006/06/14(水) 02:35:39
ファイル名に日本語を使うところが漢だな

237 名前:デフォルトの名無しさん :2006/06/14(水) 02:55:13
そりゃ拡張子がcppじゃC言語にはならない罠。

238 名前:232 :2006/06/14(水) 03:13:20
>>231
ちょっとドキュメントやらソースやら読んでみた。

まず押さえてほしいのは、このフレームワークはファイルシステム上にオブジェクトを保持するということ。
だから、オブジェクトをファイルに読み書きするメソッドはすべてのクラスで必須。
具体的な読み書きは、それぞれのクラスで定義されたメソッドStreamer()でやってる。

ここまでOK?

Copy(TObject &)は引数として与えられたオブジェクトにthisをコピーする。
それぞれのクラスできちんと定義してやる必要あり。
使う側は引数としてthisと同じクラスのオブジェクトを、
利用者の責任で用意して渡す必要がある。

(続く)

239 名前:232 :2006/06/14(水) 03:14:44
(238の続き)

Clone()はthisのコピーを作って返す。フツーのC++プログラムなら、
こいつもそれぞれのクラスできちんと定義する必要があるのだが、このフレームワークでは、
Streamer()を利用して、thisにファイルに書き出しておいて、それを読み出すことでコピーを作る、
というトリックを使っている(このトリック自体は、永続化フレームワークではよく使われる)ので、
Clone()の定義自体はTObjectのやつを使い回すことが可能になっている。
つまり、それぞれのクラスでClone()を定義する必要はない
(TNamedみたいに、TObjectの振る舞いを変えたい、という事情がない限りは)。

さっきの「MyClass::Clone()を実装する必要が本当にあるの?」は忘れてクレイ。
上に書いた理由から、Streamer()はそれぞれのクラスで定義することが必要だし、
Clone()は定義する必要はない。

> classのmemberをポインタにするかどうかの判断は、 
> 実行時にnewしたいかどうかだけで決めるものですか?
これも関係ない。混乱させたならスマソ。
このフレーワークの他のクラスでやってるみたいに、ポインタじゃなくてOK。

以上、思ったよりも長文になった。関係ない人には申し訳ない。

240 名前:232 :2006/06/14(水) 03:41:03
×Streamer()を利用して、thisにファイルに書き出しておいて、それを読み出すことでコピーを作る、
○Streamer()を利用して、thisをファイルに書き出しておいて、それを読み出すことでコピーを作る、

一番肝心なところで・・・orz

241 名前:231 :2006/06/14(水) 05:40:07
>>240
詳細にどうもです。
ソースは理解していないけど、何をしているかが分かりました。
参考にして書き書きします。

242 名前:232 :2006/06/14(水) 08:06:59
フレームワークの設計(というか実装というか)には
いろいろ気になる部分もあるが、何とか頑張ってホスイ。


243 名前:デフォルトの名無しさん :2006/06/14(水) 12:23:04
template < int X >
class Foo
{
  //ストリーム演算子をfriend宣言
  template < int X >
  friend std::ostream & operator << ( std::ostream & out, Foo<X> const & val ) ;
  
private :
  //実際の出力は、このメンバ関数が行う。
  void print( std::ostream & out ) const { out << "private!" ; };
} ;

template < int X >
std::ostream & operator << ( std::ostream & out, Foo<X> const & val )
{
  val.print(out) ;
  return out ;
}

int main( )
{
  Foo<1> f ;
  std::cout << f << std::endl ;
}

上記のコードを、VC8でコンパイルすると、
 >C2593: 'operator <<' があいまいです。
と言われてしまいます。
どうも、friend宣言も関数の定義と解釈しているようなのですが。
Barton and Nackman trickを使えば、なんとか意図通りのことができるのですが、
これは仕方がないのでしょうか?

244 名前:デフォルトの名無しさん :2006/06/14(水) 12:40:49
>>243
template < int X >
class Foo;

template < int X >
std::ostream & operator << ( std::ostream & out, Foo<X> const & val ) ;

template < int X >
class Foo
{
  //ストリーム演算子をfriend宣言
  friend std::ostream & operator << <> ( std::ostream & out, Foo const & val ) ;

245 名前:243 :2006/06/14(水) 12:57:42
>>244
>operator << <>

この <>とはなんでしょうか?

246 名前:デフォルトの名無しさん :2006/06/14(水) 13:13:02
>>245
friend に指定している名前がすでに宣言された template であるとコンパイラに
認識させるための表記。また関数テンプレートの引数を、関数引数から
推測させる場合の省略表記。この場合は2番目の引数 Foo<X> から推測される
<X> の省略。

この friend が関数テンプレート operator << の X による特殊化を指すようになる。
やりたいことはこれで OK ?
関数テンプレートの宣言を事前に行わないと、文法エラーになってしまうので、
ウザイけど前方宣言が必要。

247 名前:244 :2006/06/14(水) 13:28:45
>>246
なるほど。
そういう意味での<>だったのですか。
friendでも使えるとは知りませんでした。
operatorで使っていたので、なんだかまったく別の文法のように考えてしまいました。

248 名前:244 :2006/06/14(水) 13:45:41
もうひとつだけ。
>>244のコードは、
Nontype Template Parameterのときだけコンパイルエラーになるのですが、
何故でしょうか。

249 名前:デフォルトの名無しさん :2006/06/14(水) 14:15:22
>>248
詳しく調べてないけど、 VC がバグってんじゃね?
ちなみに cygwin gcc 3.4 だと最初のコードでも
テンプレート仮引数名の重複さえ直してやればコンパイルはできた。
全部の特殊化に対する friend 指定になっちゃうと思うけど。

250 名前:デフォルトの名無しさん :2006/06/14(水) 14:22:21
>>247-248
>>244 じゃなくて >>243 だよね?


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