ゆとりーなの日記

日記的な事を書いて行くと思はれる

これは理不尽

こんなコードがあったとします。

int main() {
  for (int i = 0; i < (4 + 2)); ++i) {
  }
}

まぁ単純にfor文の第二項の)が一つ多いわけですが、VC++2010に於けるエラーは次のようになります。

1>------ ビルド開始: プロジェクト: testvc2010, 構成: Debug Win32 ------
1>  main.cc
1>d:\あ\documents\visual studio 2010\projects\testvc2010\testvc2010\main.cc(22): error C2143: 構文エラー : ';' が ')' の前にありません。
1>d:\あ\documents\visual studio 2010\projects\testvc2010\testvc2010\main.cc(22): error C2065: 'i' : 定義されていない識別子です。
1>d:\あ\documents\visual studio 2010\projects\testvc2010\testvc2010\main.cc(22): error C2059: 構文エラー : ')'
1>d:\あ\documents\visual studio 2010\projects\testvc2010\testvc2010\main.cc(22): error C2143: 構文エラー : ';' が '{' の前にありません。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

)のことが言及されており、割とすぐに間違いに気づくことができます。
一方で昨日の記事のコードに括弧をひとつ余計に付けてしまったとします。

#include <iostream>
#include <array>
#include <boost/tuple/tuple.hpp>
#include <boost/range/irange.hpp>
#include <pstade/oven/algorithm.hpp>
#include <pstade/oven/zipped.hpp>

int main() {
  const std::array<int, 3> v = {3, 1, 4};
  pstade::oven::for_each(boost::make_tuple(v, boost::irange(0U, v.size())) | pstade::oven::zipped), 
                         [](const boost::tuples::tuple<int, int> t) {
    int x, i;
    boost::tie(x, i) = t;
    std::cout << "v[" << i << "] = " << x << std::endl;
  });
}

for_eachの第一引数に余計に一つ)を付けてしまっただけなのにエラーは、

1>------ ビルド開始: プロジェクト: testvc2010, 構成: Debug Win32 ------
1>  main.cc
1>d:\boost\boost\tuple\detail\tuple_basic.hpp(151): error C2039: 'head_type' : 'boost::tuples::null_type' のメンバーではありません。
1>          d:\boost\boost\tuple\detail\tuple_basic.hpp(47) : 'boost::tuples::null_type' の宣言を確認してください。
1>          d:\boost\boost\tuple\detail\tuple_basic.hpp(146) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::tuples::element<N,T>' の参照を確認してください
1>          with
1>          [
1>              N=0,
1>              T=boost::tuples::null_type
1>          ]
1>          d:\boost\boost\tuple\detail\tuple_basic.hpp(146) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::tuples::element<N,T>' の参照を確認してください
1>          with
1>          [
1>              N=1,
1>              T=boost::tuples::cons<const boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>,boost::tuples::detail::map_tuple_to_cons<boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>::type>
1>          ]
1>          d:\boost\boost\tuple\detail\tuple_basic.hpp(146) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::tuples::element<N,T>' の参照を確認してください
1>          with
1>          [
1>              N=2,
1>              T=boost::tuples::cons<const boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>,boost::tuples::cons<const boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>,boost::tuples::detail::map_tuple_to_cons<boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>::type>>
1>          ]
1>          d:\boost\boost\lambda\algorithm.hpp(32) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::tuples::element<N,T>' の参照を確認してください
1>          with
1>          [
1>              N=3,
1>              T=boost::tuples::tuple<boost::lambda::ll::for_each,const boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>,const boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>>
1>          ]
1>          d:\pstade_1_04_3\pstade\egg\detail\little_defer_sig_result.hpp(90) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::lambda::ll::for_each::sig<Args>' の参照を確認してください
1>          with
1>          [
1>              Args=boost::tuples::tuple<boost::lambda::ll::for_each,const boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>,const boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>>
1>          ]
1>          d:\pstade_1_04_3\pstade\egg\by_cref.hpp(83) : コンパイルされたクラスの テンプレート のインスタンス化 'pstade::egg::detail::little_defer_sig_result<SigFun,IsNullary>::apply<Myself,A0,A1>' の参照を確認してください
1>          with
1>          [
1>              SigFun=boost::lambda::ll::for_each,
1>              IsNullary=boost::mpl::false_,
1>              Myself=const pstade::egg::detail::little_defer_sig_result<boost::lambda::ll::for_each,boost::mpl::false_>,
1>              A0=const boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>,
1>              A1=const boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>
1>          ]
1>          d:\pstade_1_04_3\pstade\egg\by_cref.hpp(91) : コンパイルされたクラスの テンプレート のインスタンス化 'pstade::egg::function<Little,Strategy>::result2<A0,A1>' の参照を確認してください
1>          with
1>          [
1>              Little=pstade::egg::detail::little_defer_sig_result<boost::lambda::ll::for_each,boost::mpl::false_>,
1>              Strategy=pstade::egg::by_cref,
1>              A0=boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>,
1>              A1=boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>
1>          ]
1>          d:\boost\boost\utility\result_of.hpp(80) : コンパイルされたクラスの テンプレート のインスタンス化 'pstade::egg::function<Little,Strategy>::result<FunCall>' の参照を確認してください
1>          with
1>          [
1>              Little=pstade::egg::detail::little_defer_sig_result<boost::lambda::ll::for_each,boost::mpl::false_>,
1>              Strategy=pstade::egg::by_cref,
1>              FunCall=const pstade::egg::function<pstade::egg::detail::little_defer_sig_result<boost::lambda::ll::for_each,boost::mpl::false_>,pstade::egg::by_cref> (boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>,boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>)
1>          ]
1>          d:\boost\boost\utility\result_of.hpp(87) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::detail::result_of_nested_result<F,FArgs>' の参照を確認してください
1>          with
1>          [
1>              F=const pstade::egg::function<pstade::egg::detail::little_defer_sig_result<boost::lambda::ll::for_each,boost::mpl::false_>,pstade::egg::by_cref>,
1>              FArgs=const pstade::egg::function<pstade::egg::detail::little_defer_sig_result<boost::lambda::ll::for_each,boost::mpl::false_>,pstade::egg::by_cref> (boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>,boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>)
1>          ]
1>          d:\boost\boost\utility\detail\result_of_iterate.hpp(33) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::detail::tr1_result_of_impl<F,FArgs,HasResultType>' の参照を確認してください
1>          with
1>          [
1>              F=const pstade::egg::function<pstade::egg::detail::little_defer_sig_result<boost::lambda::ll::for_each,boost::mpl::false_>,pstade::egg::by_cref>,
1>              FArgs=const pstade::egg::function<pstade::egg::detail::little_defer_sig_result<boost::lambda::ll::for_each,boost::mpl::false_>,pstade::egg::by_cref> (boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>,boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>),
1>              HasResultType=false
1>          ]
1>          d:\boost\boost\utility\detail\result_of_iterate.hpp(81) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::tr1_result_of<F>' の参照を確認してください
1>          with
1>          [
1>              F=const pstade::egg::function<pstade::egg::detail::little_defer_sig_result<boost::lambda::ll::for_each,boost::mpl::false_>,pstade::egg::by_cref> (boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>,boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>)
1>          ]
1>          d:\pstade_1_04_3\pstade\result_of.hpp(125) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::result_of<F>' の参照を確認してください
1>          with
1>          [
1>              F=const pstade::egg::function<pstade::egg::detail::little_defer_sig_result<boost::lambda::ll::for_each,boost::mpl::false_>,pstade::egg::by_cref> (boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>,boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>)
1>          ]
1>          d:\pstade_1_04_3\pstade\oven\detail\range_based1.hpp(67) : コンパイルされたクラスの テンプレート のインスタンス化 'pstade::result_of<FunCall>' の参照を確認してください
1>          with
1>          [
1>              FunCall=const pstade::egg::function<pstade::egg::detail::little_defer_sig_result<boost::lambda::ll::for_each,boost::mpl::false_>,pstade::egg::by_cref> (boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>,boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>)
1>          ]
1>          d:\pstade_1_04_3\pstade\egg\detail\perfect_strategy_include.hpp(112) : コンパイルされたクラスの テンプレート のインスタンス化 'pstade::oven::detail::little_range_based1_result<IterBased>::apply<Myself,Range0>' の参照を確認してください
1>          with
1>          [
1>              IterBased=pstade::egg::function<pstade::egg::detail::little_defer_sig_result<boost::lambda::ll::for_each,boost::mpl::false_>,pstade::egg::by_cref>,
1>              Myself=const pstade::oven::detail::little_range_based1_result<pstade::egg::function<pstade::egg::detail::little_defer_sig_result<boost::lambda::ll::for_each,boost::mpl::false_>,pstade::egg::by_cref>>,
1>              Range0=const pstade::oven::iter_range<boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>>
1>          ]
1>          d:\あ\documents\visual studio 2010\projects\testvc2010\testvc2010\main.cc(11) : コンパイルされたクラスの テンプレート のインスタンス化 'pstade::egg::function<Little>::result1<A0>' の参照を確認してください
1>          with
1>          [
1>              Little=pstade::oven::detail::little_range_based1_result<pstade::egg::function<pstade::egg::detail::little_defer_sig_result<boost::lambda::ll::for_each,boost::mpl::false_>,pstade::egg::by_cref>>,
1>              A0=const pstade::oven::iter_range<boost::zip_iterator<boost::tuples::cons<std::_Array_const_iterator<int,3>,boost::tuples::cons<boost::range_detail::integer_iterator<unsigned int>,boost::tuples::null_type>>>> &
1>          ]
1>d:\boost\boost\tuple\detail\tuple_basic.hpp(151): error C2146: 構文エラー : ';' が、識別子 'type' の前に必要です。
1>d:\boost\boost\tuple\detail\tuple_basic.hpp(151): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>d:\boost\boost\tuple\detail\tuple_basic.hpp(151): error C2208: 'boost::type' : メンバーのない列挙型、構造体、共用体が定義されました。
1>d:\boost\boost\tuple\detail\tuple_basic.hpp(151): fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

と、)の問題に全く触れずにテンプレート関連のエラーな雰囲気を醸し出してきます。
こういうの何とかしてほしいです。実際昨日これでかなり悩みました。赤波線が引かれれば分かるのですが、昨日は何故か引かれなかったので)の多さが原因ということに気づくのに数十分かかってしまいました。