[過去ログ] Boost総合スレ part9 (981レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
356
(5): デフォルトの名無しさん [] 2011/02/28(月) 16:34:27.96 AAS
質問です。
以下ページにあるC++0x用LINQメソッドを
外部リンク:smellegantcode.wordpress.com
使用した結果をBOOST_FOREACHに入れて回そうとしたのですが、
コンパイルエラーとなってしまいます。
std::vector<int> array = { 1, 2, 3, 4, 5 };
auto result = from(array).where([] (const int & n) { return (n % 2) == 0; });
auto itr = result.begin(); // 通る
BOOST_FOREACH (auto n, result) { } // コンパイルエラー
外部リンク:ideone.com (boostの環境が作れなかったのでソース閲覧用に)
iteratorのBOOST_FOREACHに対する要件が足りていないのかと思い、
iterator_adaptorやiterator_facadeを
const_iteratorに継承させたりしてみたのですが、
私がこれらをあまり理解出来ていないこともあってか
最終的にコンパイルエラーを取り除くことが出来ませんでした。
(あとtypedef const_iterator iterator;も追加してみました)
どなたか解決のヒントをいただけませんでしょうか?
358: デフォルトの名無しさん [sage] 2011/03/01(火) 02:11:17.74 AAS
>>356 エラーメッセージは?
361: 356 [] 2011/03/01(火) 10:40:42.97 AAS
プロジェクトパス\project\boost_1_45_0/boost/mpl/eval_if.hpp:
In instantiation of 'boost::mpl::eval_if<mpl_::bool_<false
boost::range_const_iterator<filter<int, int, filter<int, int, __gnu_cxx::__normal_iterator<const int*, std::vector<int>
pass_thru<int always_true<int> >::const_iterator, pass_thru<int main()::<lambda(const int&)> >
boost::range_mutable_iterator<filter<int, int, filter<int, int, __gnu_cxx::__normal_iterator<const int*, std::vector<int>
pass_thru<int always_true<int> >::const_iterator, pass_thru<int main()::<lambda(const int&)> > > >':
プロジェクトパス\project\boost_1_45_0/boost/foreach.hpp:355:13:
instantiated from 'boost::foreach_detail_::foreach_iterator<filter<int, int, filter<int, int, __gnu_cxx::__normal_iterator<const int*, std::vector<int>
pass_thru<int always_true<int> >::const_iterator, pass_thru<int main()::<lambda(const int&)> mpl_::bool_<false> >'
プロジェクトパス\project\linq.cpp:150:2:
instantiated from here
プロジェクトパス\project\boost_1_45_0/boost/mpl/eval_if.hpp:38:31:
error: no type named 'type' in 'struct boost::mpl::eval_if<mpl_::bool_<false
boost::range_const_iterator<filter<int, int, filter<int, int, __gnu_cxx::__normal_iterator<const int*, std::vector<int>
pass_thru<int always_true<int> >::const_iterator, pass_thru<int main()::<lambda(const int&)> >
boost::range_mutable_iterator<filter<int, int, filter<int, int, __gnu_cxx::__normal_iterator<const int*, std::vector<int>
pass_thru<int always_true<int> >::const_iterator, pass_thru<int main()::<lambda(const int&)> > > >::f_'
362
(1): 356 [] 2011/03/01(火) 11:12:03.69 AAS
失礼しました。上記のがideoneのソースそのままでのコンパイルエラーです。
イテレータの解釈辺りでtypeのtypedefが無いということのようなので、
イテレータがforeachの走査対象に足る要件を満たしていないのかなと判断しました。
iterator_adaptors系を使えば良い感じに揃えてくれるのかな?と思ったのですが、
それらを用いるコードが私の理解ではきちんと書けていない状況です。
367: 356 [sage] 2011/03/02(水) 03:39:10.88 AAS
>>365
365(1): デフォルトの名無しさん [sage] 2011/03/01(火) 21:17:41.84 AAS
>362
>イテレータの解釈辺りでtypeのtypedefが無いということのようなので、
>イテレータがforeachの走査対象に足る要件を満たしていないのかなと判断しました。
多分違う。エラーが出てるのは mpl::eval_if のところなのでここでエラーの出てる type は
mpl のメタ関数としての type だ。
あとエラーの出てる行は古いコンパイラ用の workaround のところで VC++ .NET 2002 以前を使ってる場合に
当たるんだけど C++0x 向けでラムダ式とか使ってるみたいだしなんかどっかおかしそう。
なるほと・・、私の見当違いだったんですね。
マクロシンボルでの分岐をトレースして原因を調べてみたいと思います。
おかげで一歩前へ進めます。どうもありがとうございました。
370: デフォルトの名無しさん [sage] 2011/03/03(木) 00:50:04.85 AAS
>>356
そこのconst_iteratorをstd::iterator<std::input_iterator_tag, TElemTo const>から派生させたら、
BOOST_FOREACH (auto n, boost::make_iterator_range(result.begin(), result.end()))
がコンパイル通るようになった。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.041s