[表示 : 全て 最新50 1-99 101- 201- 2chのread.cgiへ]
Update time : 04/09 22:23 / Filesize : 71 KB / Number-of Response : 255
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

Boost総合スレ part7



1 名前:デフォルトの名無しさん [2009/01/19(月) 21:22:22 ]
過去スレ
part 6 pc11.2ch.net/test/read.cgi/tech/1207749841/
part 5 pc11.2ch.net/test/read.cgi/tech/1192662575/
part 4 pc11.2ch.net/test/read.cgi/tech/1175663346/
part 3 pc11.2ch.net/test/read.cgi/tech/1158991211/
part 2 pc8.2ch.net/test/read.cgi/tech/1139313234/
part 1 pc8.2ch.net/test/read.cgi/tech/1091198276/

■関連サイト■
Boost C++ Libraries
www.boost.org/

Boost 翻訳プロジェクト
boost.cppll.jp/HEAD/

Let's Boost
www.kmonos.net/alang/boost/

boost info
shinh.skr.jp/boost/

75 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 11:13:26 ]
>73
毎回そのまま張るとまた論議を呼びそうな気が。
張るんなら↓みたいにまとめた方が見やすいんじゃないだろうか。機械的処理も可能だし。
各ファイルの Added とかは要らないのでは、と思って抜いてみたんだけど Graph とかは厳しいな。

[Math]
  - Fix bug in bessel_jn for n == -1.
  - Add new test case.
[DateTime]
  - Added missing config.hpp include for the wide characters support configuration macro.
[Graph]
  - Changed to two_bit_color_map by default
  - Default color map to white, and fixed some warnings
[Asio]
  - Add missing #include <iostream>.
  - Use a pipe if eventfd is not supported at runtime. Fixes #2683.
  - Ensure arguments to windows::overlapped_ptr::complete() are passed through to the completion handler. Fixes #2614.
[Random]
  - Make validation a static member function. Fixes #2673
[Flyweight]
  - added missing std::
[Fusion]
  - fix wrong include

76 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 11:26:23 ]
現在何がアクティブなのかがわかって便利だね

77 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 15:03:26 ]
>>74
thx
たいていの場合で2倍以上速いんですね

78 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 00:18:47 ]
Boost.Regexオブジェクト構築に毎回コストがかさむのですが、
すべてクラスの変数にするとかしかないのかな。
いっぱい関数有るんでめんどくさいわ・・・


79 名前:78 mailto:sage [2009/02/08(日) 00:36:08 ]
変更が少なくていいので、
とりあえずstatic変数にすることにしました。

80 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 19:50:24 ]
1.38.0きてるお

81 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 22:14:02 ]
spiritのast_treeの質問なんですが、

//型名など一部省略してます
spirit::rule intp, expp;
intp = leaf_node_d[int_p];
expp = int_p >> *(root_node_d[ch_p(L'+')] >> int_p);

上記のようなルールで、スキップパーサにblank_pを指定して
 1 + 2
を構文解析させたとき、スキップ指定しているにもかかわらず、
2つ目の値のツリーの結果に、+から2までの間のスペースが' ''2'といった
感じに含まれてしまうのですが、leaf_node_dはそういう仕様なんでしょうか?
(1つ目の値はスペースは含まれていない)

リーフノードにスペースを含まないようにするには、スキップパーサを指定してても
intp = no_node_d[*blank_p] >> leaf_node_d[int_p];
の様に、ルール側でもスペースを飛ばすしか方法がないのでしょうか?

82 名前:81 mailto:sage [2009/02/09(月) 22:51:59 ]
訂正
expp = intp >> *(root_node_d[ch_p(L'+')] >> intp);

83 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 18:41:55 ]
更新しました。SVNは1.39に移行しました。
ttp://booster.x0.to/
以下更新内容の一部
[Units]
Zeroing in on bug with sun < 5.9
Begin tracing xlc failure
[Graph]
Integrating SOC 2007 code
Importing all_cliques, all_cycles algorithms
Importing geodesic distance module from SOC.
Imported clustering coefficient, eccentricity and core numbers algorithms.
[Regex]
Fixes #2713: change table initialisation so that it's initialised statically.
Workarounds to allow compilation by Sun studio without the -library=stlport4 option.
[Random]
correctly detect the end of the range in lagged_fibonacci_01::seed. Fixes #2703
Split random_test.cpp into multiple files to avoid hitting resource limits.
Correct stringizing
[Spirit]
Bug fix to iterator

亦、2月8日付で1.38の正式版もリリースされました。
ttp://www.boost.org/users/news/version_1_38_0

>>75
有難うございます、改善致しました。



84 名前:デフォルトの名無しさん [2009/02/13(金) 18:54:59 ]
ttp://booster.x0.to/
を利用してる奴どれくらいいるの?
手あげて



85 名前:デフォルトの名無しさん [2009/02/13(金) 19:11:38 ]
利用してます bccのバリなりもほしいです

86 名前:デフォルトの名無しさん [2009/02/13(金) 19:13:19 ]
自鯖なら、ダウンロード数、アクセス数は把握してるんでは?

87 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 19:35:58 ]
age厨は自演で何をしたいんだ?
前スレから延々つきまとってるだろお前。

88 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 23:41:16 ]
>81 の質問はスルーですか?
他所のastのサンプルでほぼ同じようなコード書かれてるけど、
スキップ文字が入るなんて説明ないし自分のミスっぽい気はするんですが。

89 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 10:26:38 ]
少なくても最近ここに訪れている人の中には回答できる人はいないと思う。

90 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 10:40:56 ]
つかえねー

91 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 11:23:14 ]
>>88
> >>81の質問はスルーですか?

お前が答えてやれよ。

92 名前:デフォルトの名無しさん [2009/02/14(土) 12:57:25 ]
>>81
blank_p ではなく space_p

tamachan.club.kyutech.ac.jp/~gridbug/spirit/spirit01.html

93 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 13:02:52 ]
>>92
やっぱ、違うっぽいorz



94 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 15:14:53 ]
>>81
intpいらない。int_pは元々単一ノードとして解析される。
expp = int_p >> *(root_node_d[ch_p(L'+')] >> int_p);
多分、leaf_node_dがint_pの前にスキップされた空白をノードに取り込んでるんだろう。

95 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 16:04:06 ]
>>94
int_pのみだと空白スキップされることはまでは試して
気がついてたのですが、int以外の自作トークンが使いたいときに
どうすれば良いのかで悩んでます。
やはりno_node_dで空白飛ばすのが正答なんでしょうかね。

96 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 17:43:19 ]
>>95
バグかも知れんね。
spirit/tree/common.hppの907行あたりを書き換えたら予想通りの結果になったよ。
if (hit) {
std::advance(from, std::distance(from, scanner.first) - hit.length());
return result_t(hit.length(),
factory_t::create_node(from, scanner.first, true));
}

97 名前:統合しました。。。: mailto:sage [2009/02/14(土) 18:08:11 ]
pc11.2ch.net/test/read.cgi/tech/1234420483/

真・スレッドリスターター。。。( ̄ー ̄)ニヤリッ

98 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 18:08:15 ]
>>96
なるほど、そうでしたか。
チュートリアルなどでもこの不具合の発生するコードがあるのに
今まで誰も問題にしなかったみたいだし、割と最近の修正で
混入したバグなんでしょうね。

わざわざ調べていただいて、ありがとうございました。

99 名前:89 mailto:sage [2009/02/14(土) 22:21:42 ]
>>96
正直侮りすぎた。スマンかった。

100 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 04:17:45 ]
謝らなくていい。ただ邪魔だから消えろ。

101 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 13:09:53 ]
それよりその不具合についてコミットしといたほうがいいんでは

102 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 14:41:28 ]
boostは読めるけど英語は読めません

103 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 18:17:28 ]
>>102
辞書引け



104 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 20:49:17 ]
タイトルをast_tree value bug ? とでもして、
症状の出る最小のコード書いて、tree.value の結果書いて // bug ?
とでも書いとけば多分汲み取ってくれるだろう。

該当フォーラムのアドが分からんので自分はコミットできませんけど。

105 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 21:11:19 ]
this sentence is written in japanese.
あとはローマ字で適当に書いておけ。

106 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 22:34:08 ]
スマートポインタを昨日から触り始めました。
これはokなのに、
boost::scoped_ptr<string> s( new string("foo") );

これはコンパイル出来ない仕組みなのはなぜ?
boost::scoped_ptr<string> s;
s = new string("foo");

たとえばコンストラクタの中でinit関数を呼んで
その中でポインタ初期化したい場合とかどうすればいいんだ

107 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 22:40:20 ]
s.reset(new string("foo"));

108 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 22:40:21 ]
>>106
s.reset(new string("foo"));

109 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 23:18:39 ]
>>106
ひとつのポインタを別々のshared_ptrに代入してはいけないのでポインタを=で代入できないようにしている。newしたらすぐにスマートポインタにセットさせるのが基本。
スマートポインタをスマートポインタに=を使って代入は可能のでこれを使って共有する。


110 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 00:07:42 ]
shared_ptrだと
boost::scoped_ptr<string> x;
boost::scoped_ptr<string> y( new string("foo") );
x = y;

scoped_ptrだと
x.reset(new string("foo"));

と理解しました。
init関数でresetって違和感ありますが、こういうものなのでしょうか。
scoped_ptrを初期化子リストでnewしない場合は
設計を見直した方がいいのかな

111 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 01:03:57 ]
見直した方がいいかもね。結果は変わらないかもしれんが。

112 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 01:12:04 ]
shared_ptrでもresetできるよ、一応念のため。

113 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 03:44:59 ]
>>110
コンストラクタから例外投げないとか言うアホなコーディング規約に縛られてるんでもなければ
初期化リストで new しとけ。



114 名前:113 mailto:sage [2009/02/17(火) 03:46:52 ]
あれ?ごめん。 init() はコンストラクタの中で呼ぶのね。

そうなると初期化リストで new しない理由がわからん。以下 >111 と同文。

115 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 08:31:26 ]
boostのshared_ptrの資料に、無名オブジェクトを使った以下のコードはfunc2が例外を投げるとリークの可能性があると書いてたけどどう?

func(shared_ptr<Hoge>(new Hoge(),func2( ))

newしてfunc2が評価されて例外投げるとshared_ptrにセットされる前の可能性があるかららしいけど、この評価順は規格上未定義だからって普通にあるの?それとも規格上ありうるってこと?


116 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 10:23:47 ]
>>115
Effective C++にも 「やるな」 って書いてなかったっけ?

117 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 11:04:26 ]
>>115
経験談だけど引数の評価順はかなり簡単に変わるから普通にある
評価順に依存してバグが起こるコードだとマジヤバイ
当然コンパイラ次第なのだけど,デバッグ用の最適化なし,と,最適化あり,にするだけで変わったりする
デバッグで問題見つからなくて泣きそうになったことある

118 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 00:53:23 ]
そんなクソコードはマクロでも使わなきゃでてこないんじゃね?

119 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 03:38:54 ]
スマートポインタどうこうは別にして
評価順によるバグなんて本能的に避けるだろ。

たまに、新米プログラマで、変数使わないで長い式をグダグダ一気に書くのが
かっこいいと思ってる奴がいるから困る



120 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 19:09:25 ]
,を越えて評価順が混ざるとは思わなかった。

121 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 19:56:50 ]
>>120
115の例に表れるカンマは関数呼び出しの一部だよ。
順次演算子としてのカンマなら、たしかに評価順序点になるけど。

122 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 21:44:14 ]
更新しました。
ttp://booster.x0.to/
以下更新内容の一部
[Units]
Get rid of duplication between conversion_helper and conversion_factor_helper.
[Graph]
Updating core_numbers from David Gleich.
Importing examples from SOC 2007
[Random]
Change shfit2 to shift2. Add missing namespace scope definitions of shift1 and shift2. Fixes #2764
Convert uniform_01 to the current distribution interface,
dispatching on the first template paramter to retain backwards compatibility. Fixes #599. Fixes #1544. Fixes #2679
[Ptr_container]
fixed bug in ptr_sequence_adapter.hpp, plus removed some warnings in detail/reversible_ptr_container.hpp.
added new overload of new_clone() that allows for null-values.
removed nasty bug in erase()
[Fusion]
use vectorN instead of vector for shorter names
#define to allow testing if unused_type has IO
[Interprocess]
Ticket #2766: error in boost::interprocess::file_lock::swap
[intrusive]
Ticket #2755: compile error in boost_intrusive 1.38.0: a set of classes with protected destructor
[Spirit]
Fix: rename "boost::math" to "boost::spirit::math".
Remove :: from memcpy()
[Serialization]
Correction to extended_type_info implementation

123 名前:デフォルトの名無しさん [2009/02/21(土) 13:25:35 ]
boost.graphについてですが、
検索を途中でキャンセルするのは例外を使用するしかない?
例:幅優先で検索し、目的のvertexが見つかったらそこで
検索をやめる。

boost.graph自体は基本的な例外安全は確保されているみたい
なので例外の使用自体に問題はないとは思いますが・・・。




124 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 13:51:45 ]
>>123
それは例外ではないから例外で抜けるのは不適当だろう。


125 名前:123 mailto:sage [2009/02/21(土) 14:02:45 ]
全検索関数を途中やめること自体が例外的・・・。
(言葉遊びですな)

126 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 17:06:21 ]
使用するに足る理由があって他の方法より適当だと思えば
例外でも何でも使えばいいと思うよ
例外だからってエラー処理以外に使わざるべしという論理的根拠はない

127 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 17:11:55 ]
エラー処理以外に例外を使って地雷を踏む例は多いんだが、地雷原と知ってもなお進むというなら止めはしない。


128 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 17:14:17 ]
実装できないよりましだな

129 名前:123 mailto:sage [2009/02/21(土) 17:46:38 ]
>>126
>例外だからってエラー処理以外に使わざるべしという論理的根拠はない
同意です。ただ他の方法があるのかという質問です。
例外使えないときもあるし。

>>127
具体的には? 例外安全に関する話題?

130 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 18:05:52 ]
見つからないってのはエラーではないのか?

131 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 19:11:13 ]
例外は単なるステートメントの1つである。

132 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 19:30:14 ]
例外しか方法ないなー
全部黒にしてvisitorの実行を抑制することならできるけど
それでも走査することには変わりねぇしな
つうことは見付かった時点で全部を辿るって前提が満たされなくなるから例外でいいんじゃないと


133 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 23:53:50 ]
別にチョコボの不思議なダンジョンのリサイクルボックスみたいに
n回使ったらバグが発生するとかそういうものでもないんだから、
そこまでして忌避したり意味を考えたりとかしなくていいんじゃなかろうか。



134 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 00:16:53 ]
Let's Boostの人スゲーなアグレシップすぎwwwwwwwwwwwwwwww

135 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 00:51:26 ]
なんか変わってる?

そういや中の人は院卒業したんだっけか。

136 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 08:04:34 ]
>132
>全部黒にしてvisitorの実行を抑制することならできるけど
TerminatorFunc を使うってことでいいですか?

137 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 09:48:29 ]
>>135
名前と写真が出るわ出るわ

138 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 10:27:09 ]
海外では顔出しも本名出しも普通だろ
ガキじゃねーんだからキャーキャー騒ぐなよ

139 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 16:50:27 ]
クラスのメンバ関数をパラメータ的に扱いたいんだけどどうすればいいかな。
こんな感じのことがしたいんだけど。

class A
{
public:
void func_a1();
void func_a2();
};

class B
{
public:
void func_b();
}

template<???>
void call_twice(???)
{
//オブジェクトとメンバ関数を引数にとってメンバ関数を2回呼ぶ
}

int main()
{
A a;
B b;

call_twice(a,func_a1);
call_twice(a,func_a2);
call_twice(b,func_b);
}

140 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 17:24:13 ]
つ boost.function

141 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 17:33:21 ]
単にメンバ関数へのポインタを使えば十分だろう。
Boost的には、bind使えば引数一つにまとまられるよと言うくらい。

142 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 18:17:25 ]
そのレスはほんとうに単純にメンバ関数へのポインタを渡すような誤解を与えるぞ。
メンバ関数へのポインタをどう使うのかを書かないと。
このスレ的には>>140を使うことを前提にしてるんだろうけど。

143 名前:139 mailto:sage [2009/02/22(日) 21:29:21 ]
レスどうもです。
boost.function使ってみました。結構いい感じ。
で、つかぬことをおききしますがboost::functioinを使った場合インライン展開はされるのでしょうか。
速度が必要なもんで気になります。
一応アセンブラをみて見たんですが俺にはよくわからない。(´・ω・`)
関数ポインタならインライン展開されなさそうなきがするんですが。








144 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 21:42:00 ]
されないね。

145 名前:139 mailto:sage [2009/02/22(日) 21:47:28 ]
そですかー(´・ω・`)
ありがとうございます。
boostってテンプレートだけじゃなくて意外と中でマクロも使われてるんですね。
いっそマクロの併用も検討するか…




146 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 21:58:17 ]
ちなみに関数ポインタもあんまインライン展開はされないぞ。

147 名前:141 mailto:sage [2009/02/22(日) 21:59:17 ]
>>142
単にこれでいいだろうというつもりで書いた。やや楽観的期待だが、インライン展開もされるだろう
template<typename T>
void call_twice(T x, void (T::*p)())
{
(x.*p)();
(x.*p)();
}
int main()
{
A a;
B b;
call_twice(a, &A::func_a1);
call_twice(a, &A::func_a2);
call_twice(b, &B::func_b);
}

148 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 22:02:38 ]
>>143
速度が必要なら仮想関数や関数ポインタは向かないね。
テンプレートで展開されるようにしたほうがいいかも

149 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 23:51:22 ]
147くらいのコードだと頭のいいコンパイラはインライン展開しちゃうけど、
たぶん142は何らかのデータ構造にメンバ関数を保存して必要なときに
実行とかいう使い方をするだろうから最終的には間接参照が最低一回
必要になると思う。

とりあえずテンプレート使ってみた版

template <class T, void (T::* func)()>
void call_twice(T t) {
 (t.*func)();
 (t.*func)();
}

int main() {
 A a;
 B b;
 call_twice<A, &A::func_a1>(a);
 call_twice<A, &A::func_a2>(a);
 call_twice<B, &B::func_b>(b);
}

150 名前:139 mailto:sage [2009/02/23(月) 00:15:36 ]
>>149
うおっ!なんかすごいのきたw
テンプレートの引数にvoid (T::* func)()なんて使えるのかー。
カルチャーショックだぜ。
もっと精進せねば。

どうもありがとうございます。


151 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 11:43:44 ]
>>149
この形式だと inline 化されるというのを昔 Cryolite 氏が実験してたな

152 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 12:18:33 ]
テンプレート引数に関数クラスを渡す方法ならかなり自由度が上がるかも

153 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 16:41:31 ]
ひとつ相談なのですが、初期サイズの違う複数のpoolを同時に使うくらいなら
boost::pool<> pool(1) にして
(T*)pool.ordered_malloc(sizeof(T)) でひとつのpoolを共有すべきですか?



154 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 18:32:23 ]
>>153
サイズの種類が限られてるなら同時につかえばいいんじゃないか?


155 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 18:41:34 ]
やったことは無いんだけど、4バイト未満のチャンクって作れるのかな

156 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 09:25:08 ]
>>153
以前ordered_mallocを使ってnew []演算子を作ろうと思って試したことがあるが、
普通のnew[]演算子よりむちゃくちゃ重くなった。
おそらくメモリプールに指定のサイズの領域が空いてるかどうかチェックする処理が重いんだと思うけど…

157 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 09:45:16 ]
常識的に考えて、その方法が速いならnewの実装なんてとっくにそうなってるに決まってるだろ……

158 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 10:43:02 ]
>>154-157
ありがとうございます。参考になりました
今回は型ごとにpoolを作ろうと思います
ordered_mallocが使用される回数を極力抑えられるように書いてみます

159 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 20:17:56 ]
boost::lambda::bindで下のコードがコンパイルエラーとなります。
(1)のところを
la::bind(&human::use, man, la::var(t))();
としても同じでした。
因みにboost::bindを使用した場合は
bind(&human::use, man, ref(t))();
とするとコンパイルエラーが発生しないようになりました。
lambda::bindを使用した場合にでるコンパイルエラーを回避する方法はないでしょうか?

環境:WinXP, VC8, boost1.38.0

// main.cpp
#include <boost/lambda/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include "create.hpp"
#include "human.hpp"
#include "tool.hpp"

namespace la = boost::lambda;

int main()
{
  human man;
  tool* t(create_tool());      // toolは抽象クラス
  la::bind(&human::use, man, t)(); // -----(1)
  delete t;
}


160 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 20:18:48 ]
長いので分割失礼します。

// human.cpp
略...
void human::use(tool* t) { t->hoge(); }
略...

// tool.hpp
class tool
{
略...
virtual void hoge() = 0;
略...

[コンパイル]
main.cpp
\XXX\boost/tuple/detail/tuple_basic.hpp(419) : error C2259: 'tool'
: 抽象クラスをインスタンス化できません。
    次のメンバが原因です:
    'void tool::hoge(void)' : は抽象型です
    \YYY\tool.hpp(6) : 'tool::hoge' の宣言を確認してください。


161 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 20:55:08 ]
突然ですが、おまえらに問いたい!
boostのイメージカラーは何色?

162 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 21:01:09 ]
マ板でやれ

163 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 21:03:29 ]
>>161
失せろクズ



164 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 21:48:39 ]
>>161
二度とくんなカスが

165 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 21:49:15 ]
>>161
VIPでやれ

166 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 21:53:55 ]
ここまで俺の自演

167 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 22:12:16 ]
>>159
create_toolの中は?

168 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 22:21:11 ]
>>162〜166
オメーも反応すんなヴォケ
しかも一人で無駄に投稿すんな。

169 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 22:23:56 ]
159です。
>> 167

// create.cpp
class hammer : public tool
{
public:
略...
void hoge()
{
  // 実装
}
略...
};

tool* create_tool()
{
  return new hammer;
}

といった感じです。
toolの具象クラスのhammerは表に出ないようになっています。


170 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 23:17:28 ]
>>169
とりあえずboost::refをつけたら、こっちではコンパイル通った
la::bind(&human::use, boost::ref(man), t)(); // -----(1)
GCC 4.0.1, boost 1.38.0

171 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 23:59:16 ]
159です。

>>170
確かに
void human::use(tool*);
ならそれで通りますね。ありがとうございます。

私の実際のコードでは
void human::use(tool&);
となっていまして、教えて頂いたようにしても同じコンパイルエラーが発生してしまいます。


172 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 07:01:49 ]
>>171
*と&はまったく違う意味だぞ。
そこで一時オブジェクトを作ろうとしてエラーになってるんじゃないのかconst tool&にしてみろ

173 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 09:59:28 ]
159です。

>>172
void tool::hogeがconstでないのでtool const&とはできません。
一度実際のコードを載せてみます。

// create.hpp
#pragma once
struct tool;
tool* create();

// create.cpp
#include <iostream>
#include "create.hpp"
#include "tool.hpp"
using namespace std;
struct hammer : tool { void effect() { cout << "gotin\n": }
tool* create() { return new hammer; }

// human.hpp
#pragma once
struct tool;
struct human { void use(tool& t); }

// human.cpp
#include "human.hpp"
#include "tool.hpp"
void human::use(tool& t) { t.effect(); }




174 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 10:00:01 ]
// tool.hpp
#pragma once
struct tool {
  virtual ~tool() throw() {}
  virtual void effect() = 0;
};

// main.cpp
#include <boost/lambda/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <memory>
#include "create.hpp"
#include "human.hpp"
#include "tool.hpp"
using namesace boost;
using namespace std;
namespace la = lambda;
int main() {
  auto_ptr<tool> t(create());
  human man;
  la::bind(&human::use, la::var(man), la::var(*t))();
}


175 名前:デフォルトの名無しさん [2009/02/25(水) 11:30:52 ]
struct pred
{
pred(int){}; ←(A)
void operator()(int v) const
{
std::cout << v << "\n";
}
};

boost::function_output_iterator<pred> fi(pred(0));←こうするには(A)が必要
boost::function_output_iterator<pred> fi(pred());←(A)を消してこう書くことができない←(B)

std::vector<int> v(boost::counting_iterator<int>(0),boost::counting_iterator<int>(10));

std::copy(v.begin(), v.end(), fi);←(B)だとここでエラー
std::copy(v.begin(), v.end(), boost::make_function_output_iterator(pred()));←これだと(A)がなくてもOK

make_function_output_iteratorは(B)と同じことしているんじゃないの?






[ 続きを読む ] / [ 携帯版 ]

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

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