ラベル boost の投稿を表示しています。 すべての投稿を表示
ラベル boost の投稿を表示しています。 すべての投稿を表示

2026年3月30日月曜日

boost::geometry::extensions が boost_1_90_0 で工事中

boost::geometry の 拡張アルゴリズムを利用しておりまして、boost がリリースされる毎に boost::geometry のリポジトリから対応するものを持ってきて使っておりました。
no_rescale_policy というのが廃止されるとの事で、dissolve のルーチンも graph ベースのルーチンに絶賛改良の工事中でコンパイルが通りませんでした。
ちょちょっと、前のバージョンのものを流用すれば良いと高を括っていたら、結構な変更が入っていて、全然コンパイルが通らない…

という事で、一時的にでも手直しをして利用する事にしました。
一応 dissolve のテストは全部通したいと思って GPT-5.3-Codex にお手伝いいただいて、修正をかけようとしたら、
GPTが以下のプロセスに入って終了しない。

  •  修正アルゴリズムを考える
  •  修正を試みる 
  • テストをする 
  • テストの成績が平行または悪化
  • 修正を巻き戻す
GPTはダメだと思って Opus-4.6 にバトンタッチして修正をさせる事に…
通らないテストについて聞いてみると、自己交差をした図形が自動修復されるかテストしているとの事
正解をsvgで図形化して見せてもらったが、そもそもOuterとInnerの判別が主観によるもので、条件が曖昧すぎます。
という事で、自己交差している図形のテストを外して、テストを通過する事を目標に実装させました。

boost::geometry に足りないのは、make_valid に相当するルーチンだろうと思いまして、自社で作成したライブラリのアルゴリズムを make_valid として実装させる事にしました。
という感じで置いときます。 https://github.com/oki-hunes/boost_geometry_added

2022年3月31日木曜日

datetime の 曖昧なフォーマットに対応する忘備録

日付のフォーマットと制約が厳しい。
わりとありそうな日付の表記ゆれをパースするグラマーを構築してみた。
#include <boost/spirit/include/qi.hpp>  // boost::spirit::qi を利用します
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
#include <iostream>
#include <string>


#include <boost/date_time.hpp>

namespace pt = boost::posix_time;
namespace qi = boost::spirit::qi;


struct timeinfo {
  int16_t   year_;
  uint16_t  month_;
  uint16_t  day_;
  uint16_t  hour_;
  uint16_t  minute_;
  uint16_t  second_;
  //uint32_t  millisec_;
  std::string millisec_;
};

BOOST_FUSION_ADAPT_STRUCT(
  timeinfo,
  (int16_t,     year_)
  (uint16_t,    month_)
  (uint16_t,    day_)
  (uint16_t,    hour_)
  (uint16_t,    minute_)
  (uint16_t,    second_)
  //(uint32_t,    millisec_)
  (std::string,  millisec_)
)

template <typename Iterator, typename Skipper>
struct time_grammar : qi::grammar<Iterator, timeinfo(), Skipper> {
  qi::rule<Iterator, timeinfo(), Skipper>  start_;
  qi::int_parser<int16_t,10,4,4> int4_;
  qi::uint_parser<uint16_t,10,2,2> uint2_;
  qi::rule<Iterator, std::string(), Skipper> numeric_;

  time_grammar() : time_grammar::base_type(start_, "time_grammar") {
    numeric_ = *qi::char_('0','9');
    start_ = (
        int4_ 
        >> -(qi::lit('/') | qi::lit('-')) >> uint2_
        >> -(qi::lit('/') | qi::lit('-')) >> uint2_
        //>> (qi::lexeme[qi::lit(' ')] | qi::lit('T'))
        >> -(qi::lit('T'))
        >> uint2_
        >> -(qi::lit(':')) >> uint2_
        >> -(qi::lit(':')) >> uint2_
        >> (
          //-( (qi::lit('.') | qi::lit(',')) >> qi::uint_)
          -( (qi::lit('.') | qi::lit(',')) >> numeric_)
          | qi::attr(0)
        )
        >> -(qi::lit('Z'))
    );
  }
};



int main() {
  
  std::string input[] = {
    "20210412T123455Z",
    "20210412T123455,987654321Z",
    "20210412T123455.987654321Z",
    "2004-03-21 12:45:33",
    "2004/03/21 12:45:33",
    "23.09.2004 04:12:21",
    "2003-02-11"
  };

  time_grammar<std::string::iterator, qi::standard::space_type> myg;
  for( int i = 0; i < sizeof(input)/sizeof(input[0]); i++ ) {
    timeinfo ti;
    qi::phrase_parse( input[i].begin(), input[i].end(), myg, qi::standard::space, ti );
    std::cout << "--------------" << std::endl;
    std::cout << ti.year_ << std::endl;
    std::cout << ti.month_ << std::endl;
    std::cout << ti.day_ << std::endl;
    std::cout << ti.hour_ << std::endl;
    std::cout << ti.minute_ << std::endl;
    std::cout << ti.second_ << std::endl;
    std::cout << ti.millisec_ << std::endl;
  }
  return 0;
}
2023/06/02 追記: lexeme がうまく動作しないのでスペースを無視した。millisec が ,020Z と指定された場合 2 に変換されてしまうので std::string で扱うようにした。バグでした。

2022年3月28日月曜日

boost::log windows で /dev/null 忘備録

boost::log でデバッグ用ログの埋め込みを行っていて、リリース時には取り除きたい場合の措置。
これだと、nul デバイスに対して出力する処理が入るので、負荷を取り除くという面では、よろしくないコード

ポイントは、
Windows では nul というファイルが /dev/null に相当する
nul というファイルは、どこにでも存在している扱いになるので、追加書き込みモードで開く必要がある点

#include <boost/date_time.hpp>

#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/attributes.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/support/date_time.hpp>

namespace logging = boost::log;
namespace attrs = boost::log::attributes;
namespace keywords = boost::log::keywords;
namespace sinks = boost::log::sinks;
namespace expr  = boost::log::expressions;

...

//#define DEBUG_LOG_FILE  "c:/logs/%Y_%m_%d.log"

...

  boost::log::add_file_log(
#ifdef DEBUG_LOG_FILE
    keywords::file_name = DEBUG_LOG_FILE,
#else
    keywords::file_name = "nul",
    keywords::open_mode = std::ios_base::out | std::ios_base::app,
#endif
    keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0),
    keywords::format = 
    (
        expr::stream
            << expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S")
            << ": <" << logging::trivial::severity
            << "> " << expr::smessage
    ),
    keywords::auto_flush = true
  );
  BOOST_LOG_TRIVIAL(debug) << "this is a debug output.";

...

2019年9月19日木曜日

boost::posix_time::ptime 無効かどうかチェックする is_not_a_date

日付に有効な値がセットされているかどうか、チェックする。
#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>

int main() {
  boost::posix_time::ptime pt;
  
  if( !pt.date().is_not_a_date() ) {
    std::cout << "TRUE" << std::endl;
  } else {
    std::cout << "FALSE" << std::endl;
  }
  std::cout << pt << std::endl;
  
  return 0;
}

2019年5月21日火曜日

BOOST SPIRIT GUIDE

業務でこのライブラリ使ってまして、SJISからUNICODE化する時に、ここのパートの修正で死にそうになりました。その時に感じたのが、現状に見合った情報が少なくて、書いてある事が現状と合っているか取捨選択に時間がかかるという事。

せっかく突っ込んで調べたので、ノウハウをガイドという形で残そうと、boost::spirit のガイドを書き始めました。

自分では使っていない機能もあったりして、使ってない部分はコード書いて検証して書き進めたりしているので、そういう部分は、時間がかかったりもしてます。

一段落してきたので、ペース落として、ぼちぼちと書いてます。
https://oki-miyuki.github.io/boost_spirit_guide/

皆さんの参考になれば幸いです

2018年6月9日土曜日

boost::compute テスト

ちょいと GPU 使ってみようかと思って OpenCL について調べました。macbook pro retina MID2012 が壊れて、GPU が Intel Iris しか搭載されてないものに買い替えたため、Cuda は選択肢に無くなったんです。データセンターで使うな騒動もあったし、Cuda は、もうええんですわ。
そしたら、boost::compute というのがあって、OpenCL を使えるらしいのです。
チュートリアルを macbook pro でコンパイルしてみたら動く感じだったんで、本当に速いのかチェックしてみました。

コンパイルは、brew install boost してある状態で、こんなん。
g++ tutorial3.cpp -I /usr/include -framework OpenCL -std=c++11 -lboost_timer
チュートリアルを少し弄ってあります。
#include <vector>
#include <algorithm>

#include <boost/compute/algorithm/transform.hpp>
#include <boost/compute/container/vector.hpp>
#include <boost/compute/functional/math.hpp>

#include <iostream>
#include <cmath>
#include <boost/timer/timer.hpp>

namespace compute = boost::compute;

int main()
{
    // get default device and setup context
    compute::device device = compute::system::default_device();
    compute::context context(device);
    compute::command_queue queue(context, device);

    std::vector<float> host_vector(100000000);

    boost::timer::cpu_timer timer;

    float n = 1.0f;
    std::generate(host_vector.begin(), host_vector.end(), [&n]() { return n += 1.0f; });
    // generate random data on the host
    //std::generate(host_vector.begin(), host_vector.end(), rand);

    timer.start();

    // create a vector on the device
    compute::vector<float> device_vector(host_vector.size(), context);

    // transfer data from the host to the device
    compute::copy( host_vector.begin(), host_vector.end(), device_vector.begin(), queue );

    // calculate the square-root of each element in-place
    compute::transform(
        device_vector.begin(),
        device_vector.end(),
        device_vector.begin(),
        compute::sqrt<float>(),
        queue
    );

    // copy values back to the host
    compute::copy( device_vector.begin(), device_vector.end(), host_vector.begin(), queue );
    
    timer.stop();
    
    std::cout << "GPU: " << timer.format() << std::endl;

    n = 1.0f;
    std::generate(host_vector.begin(), host_vector.end(), [&n]() { return n += 1.0f; });
    
    std::sqrt<float>(n);
    
    timer.start();
    std::transform( host_vector.begin(), host_vector.end(), host_vector.begin(), static_cast<float (*)(float)>(std::sqrt));
    timer.stop();
    std::cout << "CPU: " << timer.format() << std::endl;
    
    //for( float x: host_vector) { std::cout << x << ","; }

    return 0;    
}
元は 10000 個の配列演算だったんですが、それだと
GPU:  0.078395s wall, 0.000000s user + 0.000000s system = 0.000000s CPU (n/a%)
CPU:  0.000097s wall, 0.000000s user + 0.000000s system = 0.000000s CPU (n/a%)
メモリ転送の処理に時間がかかって効果を確認できず。
100000000 個の配列演算で比較すると
GPU:  0.367576s wall, 0.000000s user + 0.170000s system = 0.170000s CPU (46.2%)
CPU:  0.819997s wall, 0.820000s user + 0.000000s system = 0.820000s CPU (100.0%)
ようやく効果が確認できました。

追記: host_vector size が 1000000000 -> 100000000 に訂正しました

2017年12月19日火曜日

Windows 環境変数適用 備忘録

環境変数を値に置き換える
#include <boost/regex.hpp>
#include <string>
#include <iostream>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

std::string getEnvValue(const std::string& str) {
  std::string result;
  std::string inp = str.substr( 1, str.size() - 2 );
  //std::cout << inp << std::endl;
  char buf[ 4096 ];
  DWORD sz = sizeof(buf);
  if( GetEnvironmentVariable( inp.c_str(), buf, sz ) > 0 ) {
    result = buf;
  }
  return result;
}

bool replaceEnv(std::string& str) {
  boost::regex r("(%[a-zA-Z0-9_]+%)");
  boost::smatch m;
  if( boost::regex_search(str, m, r) ) {
    std::string eval = m.str(1);
    std::string sval = getEnvValue( eval );
    while( std::string::npos != str.find(eval) ) {
      str.replace( str.find(eval), eval.size(), sval );
    }
    return true;
  }
  return false;
}

int main(int argc, char* argv[]) {
  std::string str = "%USERPROFILE%\\hoge\\fuga";
  while( replaceEnv( str ) ) {}
  std::cout << str << std::endl;

  

  return 0;
}

2016年8月24日水曜日

digest 作成備忘録

OpenSSL の SHA-256 を利用してダイジェスト文字列を作る備忘録です。
英数字を小文字にするのどうやるんだっけ?ってあたりから、激しくドレインしてます。
#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm> // transform
#include <string>
#include <openssl/rsa.h>
#include <openssl/sha.h>
#include <boost/algorithm/hex.hpp>
#include <boost/algorithm/string/case_conv.hpp>

namespace {
  const char heading[] = "heading";
}


void show_usage() {
  std::cout << "make_digest [string]" << std::endl;
}

std::string digest( const char* str ) {
  unsigned char hash[SHA256_DIGEST_LENGTH];
  SHA256_CTX ctx;
  SHA256_Init(&ctx);
  SHA256_Update(&ctx, str, strlen(str));
  SHA256_Final(hash, &ctx);
  std::string result( (const char*)hash, SHA256_DIGEST_LENGTH );
  return result;

}

int main(int argc, char* argv[]) {

 if( argc != 2 ) {
  show_usage();
  return 1;
 }
 std::string charange( heading );
 charange += std::string( argv[1] );
 std::string hoge = digest( charange.c_str() );
 std::string digest;
 boost::algorithm::hex( hoge, std::back_inserter( digest ) );
 boost::algorithm::to_lower( digest );
 //std::transform( digest.begin(), digest.end(), digest.begin(), ::tolower );
 std::cout << digest << std::endl;

  return 0;
}

2016年1月29日金曜日

boost::geometry 自己交差解消

boost::geometry では、自己交差しているポリゴン図形の入力はエラーとして受け付けません。 関連:boost::geometry でもハマった とは言っても、人間の手を介して入力される限り、自己交差しているような図形は後を絶ちません。 やっぱり、これを解消する手段は、是非とも欲しいところであります。 参考:http://boost-geometry.203548.n3.nabble.com/How-to-repair-self-intersections-td4025893.html 参考URLによりますと、開発バージョンの中には、extensions というヘッダが構築されておりまして、その中にありました。
// Boost.Geometry (aka GGL, Generic Geometry Library)

// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.

// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//

#include <algorithm> // for reverse, unique
#include <iostream>
#include <string>

#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/adapted/c_array.hpp>
#include <boost/geometry/multi/geometries/multi_polygon.hpp>

#include <boost/geometry/extensions/algorithms/dissolve.hpp>

// dissolve.hpp の中で省略系の namespace が宣言なしに使用されていたので追加
namespace bg = boost::geometry;


BOOST_GEOMETRY_REGISTER_C_ARRAY_CS(cs::cartesian)


int main(void)
{
    using namespace boost::geometry;

    typedef model::d2::point_xy<double> point_2d;
    typedef model::polygon<point_2d> polygon_2d;
    typedef model::box<point_2d> box_2d;
    typedef model::multi_polygon<polygon_2d> multi_polygon_2d;

    // Define a polygon and fill the outer ring.
    // In most cases you will read it from a file or database
    polygon_2d poly;
    {
        const double coor[][2] = {
          { -162.277344, -684.941406 },
          { -154.300781, -684.707031 },
          { -147.291016, -768.253906 },
          { -148.601562, -752.630859 },
          { -156.675781, -753.292969 },
          { -155.425781, -768.546875 }
      };
      assign_points(poly, coor);
    }

    // Polygons should be closed, and directed clockwise. If you're not sure if that is the case,
    // call the correct algorithm
    correct(poly);

    // 自己交差を解消するためには、出力先はマルチポリゴンである必要があります。
    multi_polygon_2d solved;
    // ポリゴンを入れて、自己交差を解消し、分解して solved に入れます。
    dissolve(poly, solved);
  
  
    // Polygons can be streamed as text
    // (or more precisely: as DSV (delimiter separated values))
    std::cout << dsv(poly) << std::endl;
  
    multi_polygon_2d v;

    try {
      // intersection(poly, poly, v); では例外が発生しますが…
      intersection(solved, solved, v);
    } catch(const std::exception& e) {
      std::cerr << e.what() << std::endl;
    }
    // 大丈夫!

    std::cout << "Clipped output polygons" << std::endl;
    for (multi_polygon_2d::const_iterator it = v.begin(); it != v.end(); ++it)
    {
        std::cout << dsv(*it) << std::endl;
    }
  
    return 0;
}

2014年3月13日木曜日

boost::filesystem v3 で windows 環境にて日本語ファイルを扱う備忘録

Default encoding under windows を参考にやってみました。 コンパイラが VC8 だったので、最初、手を抜いてソースコードを UTF-8 でファイルに保存して実行してみたら
#include <boost/locale.hpp>
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/format.hpp>

int main()
{
  // Create and install global locale
  std::locale::global(boost::locale::generator().generate(""));
  //std::locale::global(boost::locale::generator().generate("ja_JP.UTF-8"));
  // Make boost.filesystem use it
  boost::filesystem::path::imbue(std::locale());
  // Now Works perfectly fine with UTF-8!
  boost::filesystem::ofstream hello("こんにちわ.txt"); 
  return 0;
}
出力されたファイル名が
こんにちめEtxt
なんじゃこれ??? あれこれ、試しているうちに、どうやら UTF-8 で保存したのがいけないみたいだという事で
#include <boost/locale.hpp>
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/format.hpp>

int main()
{
  // Create and install global locale
  std::locale::global(boost::locale::generator().generate(""));
  //std::locale::global(boost::locale::generator().generate("ja_JP.UTF-8"));
  // Make boost.filesystem use it
  boost::filesystem::path::imbue(std::locale());
  // Now Works perfectly fine with UTF-8!
  //boost::filesystem::ofstream hello("こんにちわ.txt"); 
                                   //  こ          ん          に          ち          わ
  boost::filesystem::ofstream hello("\xE3\x81\x93\xE3\x82\x93\xE3\x81\xAB\xE3\x81\xA1\xE3\x82\x8F.txt"); 
  return 0;
}
と正攻法で書きなおしたら、ちゃんと動作しました。 また、くだらない事に時間を費やしてしまった(´・ω・`)

2014年3月12日水曜日

boost::polygon self intersection problem 顛末

この前のポストの問題ですが、面白い事がわかったので、顛末を書きます。 OpenGLES では、描画が float 精度までで、データは double 精度で保持しておりました。 これを boost::polygon にて、trapezoid にかけて台形化処理するのですが、その時に double から float に static_cast で精度を落とします。そうすると、自己交差の無い simple な図形が精度変換の過程で自己交差を持つ図形に変身するケースがあると判明しました。  じゃあ事前に float 精度に落として 自己交差のある状態の図形は float 精度で自己交差を解消した simple な状態にしてから double に戻せば問題無いだろうと思って、やってみましたが、何故かうまく行かない。詳しく突っ込んで調べていないですが、もしかしたら CPU に依存する話なのかもしれません。  余計な事をすると遅くなるので、なんとかしたかったですが、アプリが落ちてしまっては、元も子もありません。もう少し無駄な計算は省こうという事で、こんな感じで落ち着きました。
    void to_simple( Polygon& polygon ) {
      size_t len = polygon.self_.coords_.size();
      Point ss = polygon.self_.coords_[len-1];
      for( size_t i = 0; i < len-2; ++i ) {
        Point se = polygon.self_.coords_[i];
        Point es = polygon.self_.coords_[i+1];
        for( size_t j = i + 2; j < len; ++j ) {
          Point ee = polygon.self_.coords_[j];
          if( i != j ) {
            if( 
                 (ss.x() == es.x() && ss.y() == es.y() )
              || (ss.x() == ee.x() && ss.y() == ee.y() )
              || (se.x() == es.x() && se.y() == es.y() )
              || (se.x() == ee.x() && se.y() == ee.y() )
            ) {
            } else {
              double xx, yy;
              if( k_4t_close( xx, yy, ss.x(), ss.y(), se.x(), se.y(), es.x(), es.y(), ee.x(), ee.y() ) ) {
                se = Point( xx, yy );
                ee = Point( xx, yy );
                //if( i < j ) { // i < j は自明でしたねorz
                  polygon.self_.coords_.insert( polygon.self_.coords_.begin() + j, ee );
                  polygon.self_.coords_.insert( polygon.self_.coords_.begin() + i, se );
                //} else {
                //  polygon.self_.coords_.insert( polygon.self_.coords_.begin() + i, se );
                //  polygon.self_.coords_.insert( polygon.self_.coords_.begin() + j, ee );
                //}
                len += 2;
              }
            }
          }
          es = ee;
        }
        ss = se;
      }
    }

2014年3月7日金曜日

boost::polygon self intersection problem

ここ2つ前からの投稿の問題は解決しました。この前に geos というライブラリでもテストコードを実行させてみたところ
TopologyException: side location conflict at -752.63088031450525 -148.60182192355231
という例外が発生しました。boost::geometry はロバストに出来ていて、自分が例外キャッチするのを忘れていただけで、ちゃんと
Boost.Geometry Overlay invalid input exception
という例外が送出されていました。  で、どういう問題が発生してたか boost::geometryのコードを読んでみたところ、図形が Simple でない=自己交差を起こしている場合に例外が送出されていました。 なので、自己交差を解消してやれば、問題をクリアできそうな感触を得ました。 残念ながら、自己交差を解消する関数は、見当たらなかったので自作。スタイルが古いですが、古いコンパイラを使っているので auto とか使えなかったんです。 list::insert してるあたりがダサいですが、古い環境なんで、このままです(>_<) 結局、自己交差を解消してやれば、boost::polygon のコードも通りました。
#include <boost/cstdint.hpp>
#include <boost/polygon/polygon.hpp>
#include <vector>
#include <deque>
#include <cmath>
#include <iomanip>

namespace bpl = boost::polygon;
typedef double point_value_type;
typedef bpl::segment_data<point_value_type> Segment;
typedef bpl::polygon_with_holes_data<point_value_type> Polygon;
typedef bpl::polygon_data<point_value_type> Ring;
typedef bpl::polygon_traits<Polygon>::point_type Point;
typedef std::vector<Point> PointSet;
typedef std::vector<Polygon> PolygonSet;
typedef std::list<Segment> SegmentSet;

#define ACCY 1e-6

Polygon make_polygon( const point_value_type* pts, size_t count ) {
  Polygon polygon;
  polygon.self_.coords_.resize( count );
  for( size_t i = 0; i < count; ++i ) {
    polygon.self_.coords_[i].x( *pts++ );
    polygon.self_.coords_[i].y( *pts++ );
  }
  return polygon;
}

void construct( PolygonSet& polygons, Polygon polygon ) {
  using namespace bpl::operators;
  polygons |= polygon; 
}

void construct( SegmentSet& segments, const point_value_type* pts, size_t count ) {
  point_value_type ax = pts[count*2-2];
  point_value_type ay = pts[count*2-1];
  for( size_t i = 0; i < count; ++i ) {
    point_value_type bx = *pts++;
    point_value_type by = *pts++;
    segments.push_back( Segment( Point(ax, ay), Point(bx, by) ) );
    ax = bx;  ay = by;
  }
}

Polygon make_polygon(const SegmentSet& segments ) {
  Polygon polygon;
  size_t count = segments.size();
  polygon.self_.coords_.resize( count );
  size_t i = 0;
  SegmentSet::const_iterator s = segments.begin();
  SegmentSet::const_iterator e = segments.end();
  while( s != e ) {
    polygon.self_.coords_[i++] = bpl::low(*s++);
  }
  return polygon;
}


std::ostream& operator << (std::ostream& os, const Point& p) {
  os << std::setprecision(10);
  os << "{ " << bpl::x(p) << ", " << bpl::y(p) << " },\n";
  return os;
}

std::ostream& operator << (std::ostream& os, const SegmentSet& segments) {
  SegmentSet::const_iterator s = segments.begin();
  SegmentSet::const_iterator e = segments.end();
  while( s != e ) {
    os << bpl::low( *s++ );
  }
  return os;
}

//! 4点交点(線分による完全交差版)を取得する
/*!
 @attention 交点が存在しない場合、x,y は未定義である
 @retval true 交点が存在
 @retval false 交点は存在しない
*/
bool k_4t_close( 
 double& x, //!< [out] 交点X座標値 
 double& y, //!< [out] 交点Y座標値
 double xk, //!< [in] 線分KLの始点X座標値
 double yk, //!< [in] 線分KLの始点Y座標値
 double xl, //!< [in] 線分KLの終点X座標値
 double yl, //!< [in] 線分KLの終点Y座標値
 double xm, //!< [in] 線分MNの始点X座標値
 double ym, //!< [in] 線分MNの始点Y座標値
 double xn, //!< [in] 線分MNの終点X座標値
 double yn   //!< [in] 線分MNの終点Y座標値
) {
 long double xlk = xl - xk;
 long double ylk = yl - yk;
 long double xnm = xn - xm;
 long double ynm = yn - ym;
 long double xmk = xm - xk;
 long double ymk = ym - yk;
 long double det = xnm * ylk - ynm * xlk;
 if( std::fabs( det ) < ACCY ) return false;
 long double s = (xnm * ymk - ynm * xmk ) / det;
 long double t = (xlk * ymk - ylk * xmk ) / det;
 if( s < 0.0 || 1.0 < s || t < 0.0 || 1.0 < t ) return false;
 x = xk + xlk * s;
 y = yk + ylk * s;
 return true;
}

void resolve_segment( SegmentSet& segments ) {
  SegmentSet::iterator is = segments.begin();
  SegmentSet::iterator ie = segments.end();
  while( is != ie ) {
    SegmentSet::iterator cs = segments.begin();
    SegmentSet::iterator ce = segments.end();
    while( cs != ce ) {
      if( cs != is ) {
        if( bpl::intersects( *cs, *is, false ) ) {
          //std::cout << "X" << std::endl;
          double xx, yy;
          Point a = bpl::low( *cs );
          Point b = bpl::high( *cs );
          Point c = bpl::low( *is );
          Point d = bpl::high( *is );
          k_4t_close( xx, yy,
            bpl::x( a ), bpl::y( a ), bpl::x( b ), bpl::y( b ),
            bpl::x( c ), bpl::y( c ), bpl::x( d ), bpl::y( d )
          );
          Point n( xx, yy );
          //std::cout << a << n << b << std::endl;
          *cs = Segment( n, b );
          cs = segments.insert( cs, Segment( a, n ) );
          *is = Segment( n, d );
          is = segments.insert( is, Segment( c, n ) );
        } else {
          //std::cout << "o" << std::endl;
        }
      }
      ++cs;
    }
    ++is;
  }
}


int main() {
  point_value_type pts[] = {
   -162.277344, -684.941406,
   -154.300781, -684.707031,
   -147.291016, -768.253906,
   -148.601562, -752.630859,
   -156.675781, -753.292969,
   -155.425781, -768.546875,
  };
  /*
  point_value_type pts2[] = {
   -155.425781, -768.546875 ,
   -162.277344, -684.941406 ,
   -154.300781, -684.707031 , 
   -148.6018219, -752.6308803 ,
   -147.291016, -768.253906 ,
   -148.601562, -752.630859 ,
   -148.6018219, -752.6308803 ,
   -156.675781, -753.292969 ,
  };
  */
  
  SegmentSet segments;
  construct( segments, pts, 6 );

  std::cout << segments;
  
  resolve_segment( segments );
  
  std::cout << "===== RESOLVE ====\n";
  std::cout << segments;
  
  PolygonSet polygons;
  //construct( polygons, make_polygon( pts, 6 ) );
  construct( polygons, make_polygon( segments ) );
  
  return 0;
}


追記:あれ? insert のあたり、よく考えたら、まずいですかね・・・。

2014年3月6日木曜日

boost::geometry でもハマった

同じ図形を geometry でも処理してみたら、見事に落ちた。 ロバストへの道は険しいのであった(´・ω・`)
// Boost.Geometry (aka GGL, Generic Geometry Library)

// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.

// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//

#include <algorithm> // for reverse, unique
#include <iostream>
#include <string>

#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/adapted/c_array.hpp>
#include <boost/geometry/multi/geometries/multi_polygon.hpp>

BOOST_GEOMETRY_REGISTER_C_ARRAY_CS(cs::cartesian)


int main(void)
{
    using namespace boost::geometry;

    typedef model::d2::point_xy<double> point_2d;
    typedef model::polygon<point_2d> polygon_2d;
    typedef model::box<point_2d> box_2d;

    // Define a polygon and fill the outer ring.
    // In most cases you will read it from a file or database
    polygon_2d poly;
    {
#ifndef SEGV
      const double coor[][2] = {
            {2.0, 1.3}, {2.4, 1.7}, {2.8, 1.8}, {3.4, 1.2}, {3.7, 1.6},
            {3.4, 2.0}, {4.1, 3.0}, {5.3, 2.6}, {5.4, 1.2}, {4.9, 0.8}, {2.9, 0.7},
            {2.0, 1.3} // closing point is opening point
            };
#else
        const double coor[][2] = {
          { -162.277344, -684.941406 },
          { -154.300781, -684.707031 },
          { -147.291016, -768.253906 },
          { -148.601562, -752.630859 },
          { -156.675781, -753.292969 },
          { -155.425781, -768.546875 }
            };
#endif
      assign_points(poly, coor);
    }

    // Polygons should be closed, and directed clockwise. If you're not sure if that is the case,
    // call the correct algorithm
    correct(poly);

  
    // Polygons can be streamed as text
    // (or more precisely: as DSV (delimiter separated values))
    std::cout << dsv(poly) << std::endl;
  
    typedef std::vector<polygon_2d> polygon_list;
    polygon_list v;

    try {
      intersection(poly, poly, v);
    } catch(const std::exception& e) {
      std::cerr << e.what() << std::endl;
    }

    std::cout << "Clipped output polygons" << std::endl;
    for (polygon_list::const_iterator it = v.begin(); it != v.end(); ++it)
    {
        std::cout << dsv(*it) << std::endl;
    }
  
    return 0;
}
今回は vc 2008 だったのだ… /D SEGV を付けないケースでは、落ちる事はない。
cl /EHsc /GR /MD test.cpp /D SEGV
2014/03/07 追記: geos で selfIntersection にかけてみたが、やはりダメだった。
TopologyException: side location conflict at -752.63088031450525 -148.60182192355231
追記:例外処理しないといけないですね。キャッチされない例外で落ちるのは、あたりまえですね。修正しました。
Boost.Geometry Overlay invalid input exception
になりました。 追記:boost::geometry has_self_intersections.hpp でスローされる例外のようで、自己交差の無い Simple な Polygon が入力として必要なようである。用語が難しいのだが、一般に、図形の Simplify というと、複雑な点数を簡略化する(点を間引く)操作を言うので、自己交差のないポリゴンにばらす関数があれば良いのだろうか。

2014年3月5日水曜日

boost::polygon はまった

三角形分割するのに、boost::polygon を使ってたんですが、残念ながら実数版は実装されているもののサポート対象外みたいで、ロバスト性が保証されていないようです。 Android をはじめとする GLES では、Tesselation(三角形分割)がサポートされていないので、Trapezoid (台形)化してポリゴンを塗り潰してたんですけども、残念です。 以下、削ったコード。
#include <boost/cstdint.hpp>
#include <boost/polygon/polygon.hpp>
#include <vector>

using boost::int32_t;
using boost::uint8_t;

namespace bpl = boost::polygon;
typedef float point_value_type;
typedef bpl::polygon_with_holes_data<point_value_type> Polygon;
typedef bpl::polygon_data<point_value_type> Ring;
typedef bpl::polygon_traits<Polygon>::point_type Point;
typedef std::vector<Point> PointSet;
typedef std::vector<Polygon> PolygonSet;

void set_points( Polygon& polygon, const point_value_type* pts, int32_t count ) {
  polygon.self_.coords_.resize( count );
  for( int32_t i = 0; i < count; ++i ) {
    polygon.self_.coords_[i].x( *pts++ );
    polygon.self_.coords_[i].y( *pts++ );
  }
}

void construct( PolygonSet& polygons, const point_value_type* pts, int32_t count ) {
  using namespace bpl::operators;
  Polygon polygon;
  set_points( polygon, pts, count );
  polygons |= polygon;  //// SIGSEGV
}


int main() {
  float pts[] = {
   -30162.277344, -21684.941406,
   -30154.300781, -21684.707031,
   -30147.291016, -21768.253906,
   -30148.601562, -21752.630859,
   -30156.675781, -21753.292969,
   -30155.425781, -21768.546875,
  };
  
  PolygonSet polygons;
  construct( polygons, pts, 6 );

  
  return 0;
}


追記:どんな図形か調べてみた。ま、往々にしてありがちな図形やね。平行な直線が折り返しているとダメなのであろうか?普通、平行な直線は交点の計算ができないので、交点を求めたりはしない。これをやろうとすると泥沼に陥る事が多い。
2014/03/06 追記: 整数の同じ構成にしてテストを行うと、ちゃんとパスする。
#ifndef SEGF
  typedef int32_t point_value_type;
#else
  typedef float point_value_type;
#endif
にして
  point_value_type pts[] = {
#ifndef SEGF
   -22277344,  -4941406,
   -14300781,  -4707031,
    -7291016, -88253906,
    -8601562, -72630859,
   -16675781, -73292969,
   -15425781, -88546875,
#else
   -22.277344,  -4.941406,
   -14.300781,  -4.707031,
    -7.291016, -88.253906,
    -8.601562, -72.630859,
   -16.675781, -73.292969,
   -15.425781, -88.546875,
#endif
  };
ここは、難しいようで、 polygon_arbitrary_format.hpp にもデバッグ用のコードがコメントアウトされる形で埋め込まれていた。 両者で実行して、違いを見比べてみたところ セーフバージョン
processEvent_
loop
current Y -72630881
scanline size 2
( -16675781, -73292969), ( -8601822, -72630881); ( -14300781, -4707031), ( -8601822, -72630881); 
found element in scanline 1
finding elements in tree
first iter y is -7.26309e+007
loop2
loop2
counts_from_scanline size 2
aggregating
loop3
loop3
落ちるバージョン
processEvent_
loop
current Y -72.6309
scanline size 2
( -16.6758, -73.293), ( -8.60156, -72.6309); ( -14.3008, -4.70703), ( -7.29102, -88.2539); 
found element in scanline 1
finding elements in tree
first iter y is -72.6309
loop2
counts_from_scanline size 1
aggregating
loop3
loop3
更に、loop2 の条件判定文のコメントを polygon_arbitrary_format.hpp に追加して追試してみたところ、
        if(iter != scanData_.end())
          std::cout << "first iter y is " << iter->first.evalAtX(x_) << "\n";
        while(iter != scanData_.end() &&
              ((iter->first.pt.x() == x_ && iter->first.pt.y() == currentY) ||
               (iter->first.other_pt.x() == x_ && iter->first.other_pt.y() == currentY))) {
                //iter->first.evalAtX(x_) == (high_precision)currentY) {
          std::cout << "loop2\n";
          elementIters.push_back(iter);
          counts_from_scanline.push_back(std::pair<std::pair<std::pair<Point, Point>, int>, active_tail_arbitrary*>
                                         (std::pair<std::pair<Point, Point>, int>(std::pair<Point, Point>(iter->first.pt,
                                                                                                          iter->first.other_pt),
                                                                                  iter->first.count),
                                          iter->second));
          ++iter;
          if( iter != scanData_.end() ) {
            std::cout << "CHK loop2 " << iter->first.pt.x() << " == " << x_ << " && " << iter->first.pt.y() << " == " << currentY << "\n";
            std::cout << "CHK loop2 " << iter->first.other_pt.x() << " == " << x_ << " && " << iter->first.other_pt.y() << " == " << currentY << "\n";
          }
        }
セーフバージョンと落ちるバージョンでは、そもそもscanline の構成が異なっている事がわかった
processEvent_
loop
current Y -72630881
scanline size 2
( -16675781, -73292969), ( -8601822, -72630881); ( -14300781, -4707031), ( -8601822, -72630881); 
found element in scanline 1
finding elements in tree
first iter y is -7.26309e+007
loop2
CHK loop2 -14300781 == -8601822 && -4707031 == -72630881
CHK loop2 -8601822 == -8601822 && -72630881 == -72630881
loop2
counts_from_scanline size 2
aggregating
processEvent_
loop
current Y -72.6309
scanline size 2
( -16.6758, -73.293), ( -8.60156, -72.6309); ( -14.3008, -4.70703), ( -7.29102, -88.2539); 
found element in scanline 1
finding elements in tree
first iter y is -72.6309
loop2
CHK loop2 -14.3008 == -8.60156 && -4.70703 == -72.6309
CHK loop2 -7.29102 == -8.60156 && -88.2539 == -72.6309
counts_from_scanline size 1
aggregating
loop3
loop3
浮動小数点型の演算は、難しいものだ。やはり、ロバスト性を確保するのは並大抵のことではない感じだ。

2013年8月1日木曜日

boost::spirit grammar 書くのが、めんどくなってきたのでテスト

はい、boost::spirit も コマンドによって、引数となる構文構造が異なってくると、いちいち grammar 作成するのも大変ですよね? てなわけで、ちまちま phrase_parse にかけながら、コードで処理を分岐しても良いんじゃないかと思い、実験くんしてみました。
#include <boost/spirit/include/qi.hpp>
#include <string>
#include <iostream>

namespace qi = boost::spirit::qi;

int main() {
  std::string test = "put 123 aioue";
  
  auto i = test.begin();
  bool res = qi::phrase_parse( i, test.end(), qi::lit("put"), qi::ascii::space );
  std::cout << res << std::endl;
  std::string rest;
  rest.assign(i,test.end());
  std::cout << rest << std::endl;
  
  return 0;
}
出力は
1
123 aioue
いちおう 構文を qi::lit("get") に変えてみたところ
0
put 123 aioue
となりまして、ちまちまとパースしても行けそうですよね?
ちょっとしたものならば、こちらの方がササッと書けそうです。

2013年6月13日木曜日

boost::multiprecision 仮数部・指数部の取得

ドキュメントが足りてない感じで、理解するのに結構時間を要してしまったので備忘録。 長精度の整数型 cpp_int 、長精度の浮動小数点型 cpp_dec_float, 長精度の分数型 cpp_rational と大別して3タイプの型があり、精度指定ができるなど、それぞれのタイプも細かい設定ができるようになっています。そうすると、無数に型が作成可能な状態になり、爆発する型同士の組み合わせによる演算を、ひとつひとつ書いてたら大変な事になります。これを解決するために MPL を利用して型同士の種類で処理を分岐させています。 系統だって演算できるようにするための基本型が、number < BackendType, ExpressionTemplates > になり、BackendType が先の3タイプの型に相当します。 それぞれのタイプの型のメンバ関数にアクセスしたければ、number::backend() というメンバ関数をコールして、BackendType を取り出しアクセスする感じになります。 以下、サンプルです。
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>

using namespace boost::multiprecision;


int main() {
  number<cpp_int_backend<256, 256, signed_magnitude, unchecked, void> >  bi = 323456789012;
  number<cpp_dec_float<50> >  bf( "123456789012.3456" );

  std::cout << bi << std::endl;
  std::cout << bf << std::endl;

  bf = static_cast< number<cpp_dec_float<50> > >( bi );  
  
  std::cout << bf << std::endl;
  double   m;
  boost::int32_t  e;
  bf.backend().extract_parts(m,e);
  std::cout << "mantissa = " << m << ", exponent = " << e << std::endl;
  std::cout << "isint ? " << bf.backend().isint() << std::endl;
  return 0;
}

2013年5月1日水曜日

boost::any で比較

データベースのデータを透過的に扱おうとすると、型が〜型が〜って、結構面倒くさい。 なるべくなら、楽をしたいです。もっとスマートな書き方無いのかな。
#include <boost/any.hpp>
#include <string>
#include <functional>
#include <iostream>
#include <exception>

  template < class T, class OPE = std::binary_function<T,T,bool> >
  bool in_type_ope( boost::any data, boost::any value, OPE ope ) {
    try {
      return ope( boost::any_cast<T>(data), boost::any_cast<T>(value) );
    } catch( std::exception& e ) {
      return false;
    }
  }

int main() {
  boost::any a = 1;
  boost::any b = 2;
  
  std::cout << in_type_ope<int>( a, b, std::less<int>() ) << std::endl;
  std::cout << in_type_ope<int>( b, a, std::less<int>() ) << std::endl;
  a = 2;
  std::cout << in_type_ope<int>( a, b, std::equal_to<int>() ) << std::endl;

  return 0;
}

2013年3月9日土曜日

本日のバグ lambda

本日のバグ。今回は、boost::shared_ptr と boost::weak_ptr にまつわる話です。
集合セット S に foo クラスが入っており、集合セット S は生成と破棄を行います。
集合セット S に含まれる foo は、それぞれ異なりますが、重複する場合があります。
foo を shared_ptr でラップして、集合セットに保持し、全体としての foo のカタログを weak_ptr で持たそうかなぁ?とも思いましたが、カタログにアクセスする度に weak_ptr::lock を呼び出すのも非効率的です。何よりも、foo オブジェクトを探したいのに死んでいたら foo オブジェクトの値を取り出せないので、lower_bound とかで検索できないのも痛いです。
という事で、shared_ptr::use_count を調べて、カタログ以外に所有者がいなければ、消せばええやん!という風にしましたが、うまく行きませんでした。以下のコードです。
#include <iostream>
#include <vector>
#include <boost/shared_ptr.hpp>
#include <boost/range/algorithm_ext/erase.hpp>

struct foo {
};

typedef boost::shared_ptr<foo>  foo_t;

int main()
{
  std::vector<foo_t>  v;
  for( int i = 0; i < 10; ++i )  v.push_back( foo_t( new foo ) );
  std::cout << "=== run remove_erase_if" << std::endl;
  boost::remove_erase_if( v, 
    [](foo_t val) -> bool {
     std::cout << val.use_count() << std::endl;
      return val.use_count() <= 1;
    }
  );
  std::cout << "erased -> " << v.size() << std::endl;
  
  return 0;
}
はい、正解は、
   [](foo_t& val) -> bool {
参照でアクセスしないと、カウント増えますよねwwwwwって事でした。

2013年2月27日水曜日

boost::dynamic_bitset で byte配列にコピー

 せっかくサンプルを作ったので…
#include <boost/dynamic_bitset.hpp>
#include <boost/format.hpp>
#include <iostream>

int main() {
  typedef boost::dynamic_bitset<unsigned char> ubits;

  ubits bitset(16); // 16 bits

  for( int i = 0; i < 16; ++i ) {
    bitset[i] = i % 2;
  }

  char buf[2];
  
  boost::to_block_range(bitset, buf);

  std::cout << (boost::format("%x %x") % (int)buf[0] % (int)buf[1]).str() << std::endl;

  return 0;
  
}
実行結果
ffffffaa ffffffaa

2013年1月29日火曜日

くそ長ぇよ(´;ω;`)

以下のようなポストを Google+ にしようと思ったら、
エラー: システムで問題が発生しました(#500) - 1 秒後に再試行します…
なんてエラーが出たんですわ。
くそ長ぇ〜よ 
(´;ω;`)ブワッ

[  1%] Building CXX object Src/Connection/Json/CMakeFiles/GooglePlusJsonParser.dir/JsonParser.cpp.obj
JsonParser.cpp
C:\Downloads\boost_1_52_0\boost/spirit/home/support/container.hpp(117) : error C2955: 'boost::Container' : クラス テンプレート を使用するには テンプレート 引数リストが必要です
        C:\Downloads\boost_1_52_0\boost/concept_check.hpp(642) : 'boost::Container' の宣言を確認してください。
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/detail/pass_container.hpp(296) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::spirit::traits::container_value<Container>' の参照を確認してください
        with
        [
            Container=wchar_t
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/detail/pass_container.hpp(331) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::detail::pass_container<F,Attr,Sequence>::dispatch_attribute<Component>(const Component &,boost::mpl::true_) const' の参照を確認してください
        with
        [
            F=fail_function,
            Attr=wchar_t,
            Sequence=boost::mpl::false_,
            Component=boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/operator/kleene.hpp(65) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::detail::pass_container<F,Attr,Sequence>::operator ()<Subject>(const Component &) const' の参照を確認してください
        with
        [
            F=fail_function,
            Attr=wchar_t,
            Sequence=boost::mpl::false_,
            Subject=boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>,
            Component=boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/operator/kleene.hpp(84) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::kleene<Subject>::parse_container<boost::spirit::qi::detail::pass_container<F,Attr,Sequence>>(boost::spirit::qi::detail::pass_container<F,Attr,Sequence>) const' の参照を確認してください
        with
        [
            Subject=boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>,
            F=fail_function,
            Attr=wchar_t,
            Sequence=boost::mpl::false_
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/directive/lexeme.hpp(64) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::kleene<Subject>::parse<Iterator,Context,boost::spirit::qi::detail::unused_skipper<Skipper>,Attribute>(Iterator &,const Iterator &,Context &,const boost::spirit::qi::detail::unused_skipper<Skipper> &,Attribute &) const' の参照を確認してください
        with
        [
            Subject=boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>,
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Context=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,
            Skipper=boost::spirit::unused_type,
            Attribute=wchar_t
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/detail/expect_function.hpp(50) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::lexeme_directive<Subject>::parse<Iterator,Context,Skipper,Attribute>(Iterator &,const Iterator &,Context &,const Skipper &,Attribute &) const' の参照を確認してください
        with
        [
            Subject=boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Context=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,
            Skipper=boost::spirit::unused_type,
            Attribute=wchar_t
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/detail/pass_container.hpp(263) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::detail::expect_function<Iterator,Context,Skipper,Exception>::operator ()<Component,wchar_t>(const Component &,Attribute &) const' の参照を確認してください
        with
        [
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Context=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,
            Skipper=boost::spirit::unused_type,
            Exception=boost::spirit::qi::expectation_failure<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>,
            Component=const boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,
            Attribute=wchar_t
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/detail/pass_container.hpp(311) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::detail::pass_container<F,Attr,Sequence>::dispatch_container<Component>(const Component &,boost::mpl::false_) const' の参照を確認してください
        with
        [
            F=boost::spirit::qi::detail::expect_function<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,boost::spirit::unused_type,boost::spirit::qi::expectation_failure<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>>,
            Attr=std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Sequence=boost::mpl::true_,
            Component=const boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/detail/pass_container.hpp(331) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::detail::pass_container<F,Attr,Sequence>::dispatch_attribute<Component>(const Component &,boost::mpl::true_) const' の参照を確認してください
        with
        [
            F=boost::spirit::qi::detail::expect_function<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,boost::spirit::unused_type,boost::spirit::qi::expectation_failure<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>>,
            Attr=std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Sequence=boost::mpl::true_,
            Component=const boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>
        ]
        C:\Downloads\boost_1_52_0\boost/fusion/algorithm/query/detail/any.hpp(37) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::detail::pass_container<F,Attr,Sequence>::operator ()<const T>(const Component &) const' の参照を確認してください
        with
        [
            F=boost::spirit::qi::detail::expect_function<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,boost::spirit::unused_type,boost::spirit::qi::expectation_failure<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>>,
            Attr=std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Sequence=boost::mpl::true_,
            T=const boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,
            Component=const boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>
        ]
        C:\Downloads\boost_1_52_0\boost/fusion/algorithm/query/detail/any.hpp(42) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::fusion::detail::linear_any<boost::fusion::cons_iterator<Cons>,Last,F>(const First &,const Last &,F &,boost::mpl::false_)' の参照を確認してください
        with
        [
            Cons=const boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>,
            Last=boost::fusion::cons_iterator<const boost::fusion::nil>,
            F=boost::spirit::qi::detail::pass_container<boost::spirit::qi::detail::expect_function<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,boost::spirit::unused_type,boost::spirit::qi::expectation_failure<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>>,std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::mpl::true_>,
            First=boost::fusion::cons_iterator<const boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>
        ]
        C:\Downloads\boost_1_52_0\boost/fusion/algorithm/query/detail/any.hpp(55) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::fusion::detail::linear_any<boost::fusion::cons_iterator<Cons>,boost::fusion::cons_iterator<const boost::fusion::nil>,F>(const First &,const Last &,F &,boost::mpl::false_)' の参照を確認してください
        with
        [
            Cons=const boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>,
            F=boost::spirit::qi::detail::pass_container<boost::spirit::qi::detail::expect_function<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,boost::spirit::unused_type,boost::spirit::qi::expectation_failure<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>>,std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::mpl::true_>,
            First=boost::fusion::cons_iterator<const boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,
            Last=boost::fusion::cons_iterator<const boost::fusion::nil>
        ]
        C:\Downloads\boost_1_52_0\boost/fusion/algorithm/query/any.hpp(30) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::fusion::detail::any<Sequence,F,boost::fusion::forward_traversal_tag>(const Sequence &,F,Tag)' の参照を確認してください
        with
        [
            Sequence=boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>,
            F=boost::spirit::qi::detail::pass_container<boost::spirit::qi::detail::expect_function<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,boost::spirit::unused_type,boost::spirit::qi::expectation_failure<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>>,std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::mpl::true_>,
            Tag=boost::fusion::forward_traversal_tag
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/operator/sequence_base.hpp(108) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::fusion::any<Elements,boost::spirit::qi::detail::pass_container<F,Attr,Sequence>>(const boost::fusion::cons<Car,Cdr> &,boost::spirit::qi::detail::pass_container<F,Attr,Sequence>)' の参照を確認してください
        with
        [
            Elements=boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>,
            F=boost::spirit::qi::detail::expect_function<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,boost::spirit::unused_type,boost::spirit::qi::expectation_failure<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>>,
            Attr=std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Sequence=boost::mpl::true_,
            Car=boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,
            Cdr=boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/operator/sequence_base.hpp(124) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::sequence_base<Derived,Elements>::parse_impl<Iterator,Context,Skipper,Attribute>(Iterator &,const Iterator &,Context &,const Skipper &,Attribute &,boost::mpl::true_) const' の参照を確認してください
        with
        [
            Derived=boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,
            Elements=boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>,
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Context=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,
            Skipper=boost::spirit::unused_type,
            Attribute=std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/detail/alternative_function.hpp(70) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::sequence_base<Derived,Elements>::parse<Iterator,Context,Skipper,Attribute>(Iterator &,const Iterator &,Context &,const Skipper &,Attribute &) const' の参照を確認してください
        with
        [
            Derived=boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,
            Elements=boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>,
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Context=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,
            Skipper=boost::spirit::unused_type,
            Attribute=std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/detail/alternative_function.hpp(153) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::detail::alternative_function<Iterator,Context,Skipper,Attribute>::call<Component>(const Component &,boost::mpl::true_) const' の参照を確認してください
        with
        [
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Context=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,
            Skipper=boost::spirit::unused_type,
            Attribute=std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Component=const boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/detail/alternative_function.hpp(170) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::detail::alternative_function<Iterator,Context,Skipper,Attribute>::call_unused<Component>(const Component &,boost::mpl::true_) const' の参照を確認してください
        with
        [
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Context=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,
            Skipper=boost::spirit::unused_type,
            Attribute=std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Component=const boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>
        ]
        C:\Downloads\boost_1_52_0\boost/fusion/algorithm/query/detail/any.hpp(37) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::detail::alternative_function<Iterator,Context,Skipper,Attribute>::operator ()<const T>(const Component &) const' の参照を確認してください
        with
        [
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Context=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,
            Skipper=boost::spirit::unused_type,
            Attribute=std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            T=const boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,
            Component=const boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>
        ]
        C:\Downloads\boost_1_52_0\boost/fusion/algorithm/query/detail/any.hpp(42) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::fusion::detail::linear_any<boost::fusion::cons_iterator<Cons>,Last,F>(const First &,const Last &,F &,boost::mpl::false_)' の参照を確認してください
        with
        [
            Cons=const boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>,
            Last=boost::fusion::cons_iterator<const boost::fusion::nil>,
            F=boost::spirit::qi::detail::alternative_function<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,boost::spirit::unused_type,std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>,
            First=boost::fusion::cons_iterator<const boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>
        ]
        C:\Downloads\boost_1_52_0\boost/fusion/algorithm/query/detail/any.hpp(55) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::fusion::detail::linear_any<boost::fusion::cons_iterator<Cons>,boost::fusion::cons_iterator<const boost::fusion::nil>,F>(const First &,const Last &,F &,boost::mpl::false_)' の参照を確認してください
        with
        [
            Cons=const boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>,
            F=boost::spirit::qi::detail::alternative_function<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,boost::spirit::unused_type,std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>,
            First=boost::fusion::cons_iterator<const boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>>,
            Last=boost::fusion::cons_iterator<const boost::fusion::nil>
        ]
        C:\Downloads\boost_1_52_0\boost/fusion/algorithm/query/any.hpp(30) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::fusion::detail::any<Sequence,F,boost::fusion::forward_traversal_tag>(const Sequence &,F,Tag)' の参照を確認してください
        with
        [
            Sequence=boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>,
            F=boost::spirit::qi::detail::alternative_function<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,boost::spirit::unused_type,std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>,
            Tag=boost::fusion::forward_traversal_tag
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/operator/alternative.hpp(79) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::fusion::any<Elements,boost::spirit::qi::detail::alternative_function<Iterator,Context,Skipper,Attribute>>(const Sequence &,F)' の参照を確認してください
        with
        [
            Elements=boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>,
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Context=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,
            Skipper=boost::spirit::unused_type,
            Attribute=std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Sequence=boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>,
            F=boost::spirit::qi::detail::alternative_function<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,boost::spirit::unused_type,std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp(43) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::alternative<Elements>::parse<Iterator,Context,Skipper,T>(Iterator &,const Iterator &,Context &,const Skipper &,Attribute &) const' の参照を確認してください
        with
        [
            Elements=boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>,
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Context=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,
            Skipper=boost::spirit::unused_type,
            T=std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Attribute=std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp(53) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::detail::parser_binder<Parser,Auto>::call<Iterator,Skipper,Context>(Iterator &,const Iterator &,Context &,const Skipper &,boost::mpl::false_) const' の参照を確認してください
        with
        [
            Parser=boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>>,
            Auto=boost::mpl::false_,
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Skipper=boost::spirit::unused_type,
            Context=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>
        ]
        C:\Downloads\boost_1_52_0\boost/function/function_template.hpp(132) : コンパイルされたクラスの テンプレート のインスタンス化 'bool boost::spirit::qi::detail::parser_binder<Parser,Auto>::operator ()<Iterator,boost::spirit::unused_type,boost::spirit::context<Attributes,Locals>>(Iterator &,const Iterator &,Context &,const Skipper &) const' の参照を確認してください
        with
        [
            Parser=boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>>,
            Auto=boost::mpl::false_,
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            Attributes=boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,
            Locals=boost::fusion::vector0<>,
            Context=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>>,
            Skipper=boost::spirit::unused_type
        ]
        C:\Downloads\boost_1_52_0\boost/function/function_template.hpp(126): クラス テンプレート のメンバー関数 'bool boost::detail::function::function_obj_invoker4<FunctionObj,R,T0,T1,T2,T3>::invoke(boost::detail::function::function_buffer &,T0,T1,T2,T3)' のコンパイル中
        with
        [
            FunctionObj=boost::spirit::qi::detail::parser_binder<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>>,boost::mpl::false_>,
            R=bool,
            T0=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,
            T1=const std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,
            T2=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>> &,
            T3=const boost::spirit::unused_type &
        ]
        C:\Downloads\boost_1_52_0\boost/function/function_template.hpp(934) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::detail::function::function_obj_invoker4<FunctionObj,R,T0,T1,T2,T3>' の参照を確認してください
        with
        [
            FunctionObj=boost::spirit::qi::detail::parser_binder<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>>,boost::mpl::false_>,
            R=bool,
            T0=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,
            T1=const std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,
            T2=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>> &,
            T3=const boost::spirit::unused_type &
        ]
        C:\Downloads\boost_1_52_0\boost/function/function_template.hpp(722) : コンパイルされたクラスの テンプレート のインスタンス化 'void boost::function4<R,T0,T1,T2,T3>::assign_to<Functor>(Functor)' の参照を確認してください
        with
        [
            R=bool,
            T0=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,
            T1=const std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,
            T2=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>> &,
            T3=const boost::spirit::unused_type &,
            Functor=boost::spirit::qi::detail::parser_binder<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>>,boost::mpl::false_>
        ]
        C:\Downloads\boost_1_52_0\boost/function/function_template.hpp(1070) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::function4<R,T0,T1,T2,T3>::function4<boost::spirit::qi::detail::parser_binder<Parser,Auto>>(Functor,int)' の参照を確認してください
        with
        [
            R=bool,
            T0=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,
            T1=const std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,
            T2=boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>> &,
            T3=const boost::spirit::unused_type &,
            Parser=boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>>,
            Auto=boost::mpl::false_,
            Functor=boost::spirit::qi::detail::parser_binder<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>>,boost::mpl::false_>
        ]
        C:\Downloads\boost_1_52_0\boost/function/function_template.hpp(1124) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::function<Signature>::function<boost::spirit::qi::detail::parser_binder<Parser,Auto>>(Functor,int)' の参照を確認してください
        with
        [
            Signature=bool (std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,const std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>> &,const boost::spirit::unused_type &),
            Parser=boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>>,
            Auto=boost::mpl::false_,
            Functor=boost::spirit::qi::detail::parser_binder<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>>,boost::mpl::false_>
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/nonterminal/rule.hpp(183) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::function<Signature> &boost::function<Signature>::operator =<boost::spirit::qi::detail::parser_binder<Parser,Auto>>(Functor)' の参照を確認してください
        with
        [
            Signature=bool (std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,const std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::spirit::context<boost::fusion::cons<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &,boost::fusion::nil>,boost::fusion::vector0<>> &,const boost::spirit::unused_type &),
            Parser=boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>>,
            Auto=boost::mpl::false_,
            Functor=boost::spirit::qi::detail::parser_binder<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::plus<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>>,boost::fusion::cons<boost::spirit::qi::eps_parser,boost::fusion::nil>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::reference<const boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::cons<boost::spirit::qi::expect<boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::cons<boost::spirit::qi::lexeme_directive<boost::spirit::qi::kleene<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::reference<boost::spirit::qi::symbols<const wchar_t,wchar_t>>,boost::fusion::cons<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_,boost::spirit::char_encoding::standard_wide>>,boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard_wide,false,false>>,boost::fusion::nil>>>>>,boost::fusion::cons<boost::spirit::qi::literal_string<const wchar_t (&)[2],true>,boost::fusion::nil>>>>,boost::fusion::nil>>>>,boost::mpl::false_>
        ]
        C:\Downloads\boost_1_52_0\boost/spirit/home/qi/nonterminal/rule.hpp(220) : コンパイルされたクラスの テンプレート のインスタンス化 'void boost::spirit::qi::rule<Iterator,T1>::define<boost::mpl::false_,Expr>(boost::spirit::qi::rule<Iterator,T1> &,const Expr &,boost::mpl::true_)' の参照を確認してください
        with
        [
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            T1=std::wstring (void),
            Expr=boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::unary_plus,boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>,0> &>,1> &,const boost::spirit::terminal<boost::spirit::tag::eps> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::tag::lexeme>,0> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::dereference,boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,boost::proto::argsns_::list2<Gplusnasite::GooglePlusLibrary::JsonGrammar<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>::javascript_escape_wchar_t_ &,boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::minus,boost::proto::argsns_::list2<const boost::spirit::terminal<boost::spirit::tag::standard_wide::char_> ,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::standard_wide::char_,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &>,2> &>,2> &>,1> &>,2> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &>,2> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::tag::lexeme>,0> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::dereference,boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,boost::proto::argsns_::list2<Gplusnasite::GooglePlusLibrary::JsonGrammar<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>::javascript_escape_wchar_t_ &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::minus,boost::proto::argsns_::list2<const boost::spirit::terminal<boost::spirit::tag::standard_wide::char_> ,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::standard_wide::char_,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &>,2> &>,2> &>,1> &>,2> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &>,2> &>,2>
        ]
        C:\Downloads\Gplus\GooglePlusLibrary\Src\Json/JsonGrammar.hpp(78) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::spirit::qi::rule<Iterator,T1> &boost::spirit::qi::rule<Iterator,T1>::operator =<boost::proto::exprns_::expr<Tag,Args,Arity>>(const Expr &)' の参照を確認してください
        with
        [
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,
            T1=std::wstring (void),
            Tag=boost::proto::tagns_::tag::bitwise_or,
            Args=boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::unary_plus,boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>,0> &>,1> &,const boost::spirit::terminal<boost::spirit::tag::eps> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::tag::lexeme>,0> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::dereference,boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,boost::proto::argsns_::list2<Gplusnasite::GooglePlusLibrary::JsonGrammar<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>::javascript_escape_wchar_t_ &,boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::minus,boost::proto::argsns_::list2<const boost::spirit::terminal<boost::spirit::tag::standard_wide::char_> ,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::standard_wide::char_,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &>,2> &>,2> &>,1> &>,2> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &>,2> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::tag::lexeme>,0> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::dereference,boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,boost::proto::argsns_::list2<Gplusnasite::GooglePlusLibrary::JsonGrammar<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>::javascript_escape_wchar_t_ &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::minus,boost::proto::argsns_::list2<const boost::spirit::terminal<boost::spirit::tag::standard_wide::char_> ,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::standard_wide::char_,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &>,2> &>,2> &>,1> &>,2> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &>,2> &>,
            Arity=2,
            Expr=boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::unary_plus,boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::alnum,boost::spirit::char_encoding::standard>>,0> &>,1> &,const boost::spirit::terminal<boost::spirit::tag::eps> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::tag::lexeme>,0> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::dereference,boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,boost::proto::argsns_::list2<Gplusnasite::GooglePlusLibrary::JsonGrammar<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>::javascript_escape_wchar_t_ &,boost::spirit::qi::rule<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,std::wstring (void)> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::minus,boost::proto::argsns_::list2<const boost::spirit::terminal<boost::spirit::tag::standard_wide::char_> ,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::standard_wide::char_,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &>,2> &>,2> &>,1> &>,2> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &>,2> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::greater,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::tag::lexeme>,0> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::dereference,boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,boost::proto::argsns_::list2<Gplusnasite::GooglePlusLibrary::JsonGrammar<std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>::javascript_escape_wchar_t_ &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::minus,boost::proto::argsns_::list2<const boost::spirit::terminal<boost::spirit::tag::standard_wide::char_> ,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::standard_wide::char_,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &>,2> &>,2> &>,1> &>,2> &>,2> &,const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit,boost::fusion::vector1<const wchar_t (&)[2]>>>,0> &>,2> &>,2>
        ]
        C:\Downloads\Gplus\GooglePlusLibrary\Src\Json/JsonGrammar.hpp(62): クラス テンプレート のメンバー関数 'Gplusnasite::GooglePlusLibrary::JsonGrammar<Iterator>::JsonGrammar(void)' のコンパイル中
        with
        [
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>
        ]
        C:\Downloads\Gplus\GooglePlusLibrary\Src\Json\JsonParser.cpp(56) : コンパイルされたクラスの テンプレート のインスタンス化 'Gplusnasite::GooglePlusLibrary::JsonGrammar<Iterator>' の参照を確認してください
        with
        [
            Iterator=std::_String_const_iterator<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>
        ]
C:\Downloads\boost_1_52_0\boost/spirit/home/support/container.hpp(118) : fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。

もうね…。boost::pheonix::function とか、boost::proto とか絡みまくりでね…。どこで引っかかってるのか、さっぱりわかりませんわ。これでもね、問題を最小化した後なんですわ。JsonGrammar の template 引数に、Skipper として、boost::spirit::standard_wide::space_type を指定して、メンバの各ルールも qi::rule<Iterator, std::wstring(), boost::spirit::standard_wide::space_type> なんてやってたら、boost::sprit の FAQ
error C2664: 'bool boost::function4<R,T0,T1,T2,T3>::operator ()(T0,T1,T2,T3) const' : cannot convert parameter 4 from '...' to '...'
なんてエラーに引っかかたんですわ。
どんなソースをコンパイルしたら、こんなエラーになるか?つーとね…。下のコードですわ。 まぁ、下のコードも wstring_rule 中の utf_escape_rule を取り除けば大丈夫なんですけどね。
#pragma once

#ifdef GOOGLEPLUSJSON_NO_WARNINGS
#ifdef _MSC_VER
#pragma warning (disable:4819)
#endif
#endif

#include <Json/JsonObject.hpp>
#include <Json/JsonMember.hpp>

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
//#include <boost/regex/pending/unicode_iterator.hpp>


namespace Gplusnasite
{
namespace GooglePlusLibrary
{

namespace
{
  namespace qi = boost::spirit::qi;
  namespace spc = boost::spirit::standard_wide;
  namespace phoenix = boost::phoenix;

#define ON_QI_ERROR(tag) \
  qi::on_error<qi::fail>(tag, \
  std::cout << phoenix::val("Error Expecting ") \
  << qi::labels::_4 \
  << phoenix::val(" here: \"") \
  << phoenix::construct<std::string>(qi::labels::_3, qi::labels::_2) \
  << phoenix::val("\"") \
  << std::endl \
  )
}

namespace detail
{
  struct push_utf8 
  { 
     template <typename Scanner, typename CharT> 
     struct result { typedef void type; }; 

     void operator()(std::wstring& utf8, ::boost::uint32_t code_point) const 
     {
       std::back_insert_iterator<std::wstring> utf8_iter(utf8);
       //typedef std::back_insert_iterator<std::string> insert_iter; 
       //insert_iter out_iter(utf8); 
       //boost::utf8_output_iterator<insert_iter> utf8_iter(out_iter); 
       *utf8_iter++ = code_point; 
     }
  }; 
}

template <typename Iterator>
struct JsonGrammar : qi::grammar<Iterator, JsonObject()>
{
public:

  JsonGrammar() : JsonGrammar::base_type(expression,"expression")
  {
    //phoenix::function<detail::push_utf8>  push_utf8;
    //qi::uint_parser< ::boost::uint32_t, 16> hex16;

    //hex_escape_base = (L'u' >> hex16); //[push_utf8(qi::_r1, qi::_1)];
    //hex_escape_rule = hex_escape_base(qi::_val);

    utf_escape_rule = qi::lit(L"\\u") >> qi::hex; //hex_escape_rule;
    funny_escape_rule = qi::lit(L"\'u") >> qi::hex; //hex_escape_rule;

    wstring_rule = (
       +(qi::alnum) > qi::eps
    //  | (qi::lit(L"\"") > qi::lexeme[funny_escape_rule > *(funny_escape_wchar_t_rule | funny_escape_rule | (qi::standard_wide::char_ - qi::standard_wide::char_(L"\"")))] > qi::lit(L"\"")) 
      | (qi::lit(L"\"") > qi::lexeme[*(javascript_escape_wchar_t_rule | utf_escape_rule | (qi::standard_wide::char_ - qi::standard_wide::char_(L"\"")))] > qi::lit(L"\"")) 
      | (qi::lit(L"\'") > qi::lexeme[*(javascript_escape_wchar_t_rule /*| utf_escape_rule*/ | (qi::standard_wide::char_ - qi::standard_wide::char_(L"\'")))] > qi::lit(L"\'"))
    );
    
    json_wstring_rule = wstring_rule[qi::_val = phoenix::construct<JsonObject>(qi::_1)];

    int_rule = qi::int_[qi::_val = phoenix::construct<JsonObject>(qi::_1)];

    real_rule = qi::double_[qi::_val = phoenix::construct<JsonObject>(qi::_1)];

    bool_rule = bool_wchar_t_rule[qi::_val = phoenix::construct<JsonObject>(qi::_1)];

    null_rule = (qi::lit(L"null") | qi::eps);

    element_rule = (real_rule | int_rule | bool_rule | json_wstring_rule | array_rule | object_rule | null_rule);

    array_inner_rule = element_rule[phoenix::push_back(qi::_val, qi::_1)] > *(qi::lit(L",") > element_rule[phoenix::push_back(qi::_val, qi::_1)]);

    member_rule = (wstring_rule > qi::lit(L":") > element_rule)[qi::_val = phoenix::construct<JsonMember>(qi::_1,qi::_2)];

    object_inner_rule = member_rule[phoenix::push_back(qi::_val, qi::_1)] > *(qi::lit(L",") > member_rule[phoenix::push_back(qi::_val, qi::_1)]);

    object_rule = (qi::lit(L"{") > object_inner_rule > qi::lit(L"}"))[qi::_val = phoenix::construct<JsonObject>(qi::_1)] 
         | (qi::lit(L"{") > qi::lit(L"}"));  // Same as (-object_rule_inner)

    array_rule = (qi::lit(L"[") > array_inner_rule > qi::lit(L"]"))[qi::_val = phoenix::construct<JsonObject>(qi::_1)] 
           // Force to create zero length array. (Nor null_rule)
           | (qi::lit(L"[") > qi::lit(L"]"))[qi::_val = phoenix::construct<JsonObject>(zero_array)];
    
    json_rule = object_rule | array_rule;

    hex_rule = qi::hex;

    expression = qi::omit[hex_rule ^ qi::lit(L")]}'")] || json_rule;

    wstring_rule.name("wstring");
    int_rule.name("int");
    real_rule.name("real");
    bool_rule.name("bool");
    null_rule.name("null");
    element_rule.name("element");
    array_inner_rule.name("array_inner");
    member_rule.name("member");
    object_inner_rule.name("object_inner");
    object_rule.name("object");
    array_rule.name("array");

    ON_QI_ERROR(wstring_rule);
    ON_QI_ERROR(int_rule);
    ON_QI_ERROR(real_rule);
    ON_QI_ERROR(bool_rule);
    ON_QI_ERROR(null_rule);
    ON_QI_ERROR(element_rule);
    ON_QI_ERROR(array_inner_rule);
    ON_QI_ERROR(member_rule);
    ON_QI_ERROR(object_inner_rule);
    ON_QI_ERROR(object_rule);
  }
  
private:
  struct bool_wchar_t_ : qi::symbols<wchar_t const,bool>
  {
    bool_wchar_t_()
    {
      add
        (L"true" , true)
        (L"false", false)
    ;
    }
  } bool_wchar_t_rule;
  
  struct javascript_escape_wchar_t_ : qi::symbols<wchar_t const,wchar_t>
  {
    javascript_escape_wchar_t_()
    {
      add
        (L"\\b", '\b')
        (L"\\t", '\t')
        (L"\\v", '\v')
        (L"\\n", '\n')
        (L"\\r", '\r')
        (L"\\f", '\f')
        (L"\\\'", '\'')
        (L"\\\"", '\"')
        (L"\\\\", '\'')
        (L"\\0", '\0')
      ;
    }
  } javascript_escape_wchar_t_rule;

  struct funny_escape_wchar_t_ : qi::symbols<wchar_t const,wchar_t>
  {
    funny_escape_wchar_t_()
    {
      add
        (L"\'b", '\b')
        (L"\'t", '\t')
        (L"\'v", '\v')
        (L"\'n", '\n')
        (L"\'r", '\r')
        (L"\'f", '\f')
        (L"\'\'", '\'')
        (L"\'\"", '\"')
        (L"\'\\", '\'')
        (L"\'0", '\0')
      ;
    }
  } funny_escape_wchar_t_rule;

  //qi::rule<Iterator, void(std::wstring&)> hex_escape_base;
  //qi::rule<Iterator, std::wstring()> hex_escape_rule;
  qi::rule<Iterator, std::wstring()> utf_escape_rule;
  qi::rule<Iterator, std::wstring()> funny_escape_rule;
  qi::rule<Iterator, std::wstring()> wstring_rule;
  qi::rule<Iterator, std::wstring()> hex_rule;
  qi::rule<Iterator, JsonObject()> json_wstring_rule;
  qi::rule<Iterator, JsonObject()> int_rule;
  qi::rule<Iterator, JsonObject()> real_rule;
  qi::rule<Iterator, std::vector<JsonObject>()> array_inner_rule;
  qi::rule<Iterator, JsonObject()> array_rule;
  qi::rule<Iterator, JsonObject()> element_rule;
  qi::rule<Iterator, JsonMember()> member_rule;
  qi::rule<Iterator, std::vector<JsonMember>()> object_inner_rule;
  qi::rule<Iterator, JsonObject()> object_rule;
  qi::rule<Iterator, JsonObject()> bool_rule;
  qi::rule<Iterator, JsonObject()> null_rule;
  qi::rule<Iterator, JsonObject()> json_rule;
  qi::rule<Iterator, JsonObject()> expression;
  std::vector<JsonObject> zero_array;
};


}// namespace GooglePlusLibrary
}// namespace Gplusnasite
2013/02/10 追記:  結局 proto の問題だったような気がします。コンパイラが通らないから、外していた spc::space_type は、パースがうまく行かなくなるので戻しました。 現在、こんな感じに
#pragma once

#ifdef GOOGLEPLUSJSON_NO_WARNINGS
#ifdef _MSC_VER
#pragma warning (disable:4819)
#endif
#endif

#include <Json/JsonObject.hpp>
#include <Json/JsonMember.hpp>

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
//#include <boost/regex/pending/unicode_iterator.hpp>


namespace Gplusnasite
{
namespace GooglePlusLibrary
{

namespace
{
  namespace qi = boost::spirit::qi;
  namespace spc = boost::spirit::standard_wide;
  namespace phoenix = boost::phoenix;

#define ON_QI_ERROR(tag) \
  qi::on_error<qi::fail>(tag, \
  std::cout << phoenix::val("Error Expecting ") \
  << qi::labels::_4 \
  << phoenix::val(" here: \"") \
  << phoenix::construct<std::string>(qi::labels::_3, qi::labels::_2) \
  << phoenix::val("\"") \
  << std::endl \
  )
}

namespace detail
{
  struct push_utf8 
  { 
     template <typename Scanner, typename CharT> 
     struct result { typedef void type; }; 

     void operator()(std::wstring& utf8, ::boost::uint32_t code_point) const 
     {
       std::back_insert_iterator<std::wstring> utf8_iter(utf8);
       //typedef std::back_insert_iterator<std::string> insert_iter; 
       //insert_iter out_iter(utf8); 
       //boost::utf8_output_iterator<insert_iter> utf8_iter(out_iter); 
       *utf8_iter++ = code_point; 
     }
  }; 
}


#define UTF_ESCAPE_RULE    (qi::lit(L"\\u") > hex16)
#define FUNNY_ESCAPE_RULE  (qi::lit(L"\'u") > hex16)

template <typename Iterator>
struct JsonGrammar : qi::grammar<Iterator, JsonObject(), spc::space_type>
{
public:

  JsonGrammar() : JsonGrammar::base_type(expression,"expression")
  {
    //phoenix::function<detail::push_utf8>  push_utf8;
    qi::uint_parser<boost::uint16_t, 16> hex16;

    //hex_escape_base = (L'u' >> hex16)[push_utf8(qi::_r1, qi::_1)];
    //hex_escape_rule = hex_escape_base(qi::_val);

    //utf_escape_rule = qi::lit(L"\'u") > hex16;
    //funny_escape_rule = qi::lit(L"\'u") > hex16;

    wstring_rule = (
       +(qi::alnum) > qi::eps
      | (qi::lit(L"\"") >> qi::lexeme[FUNNY_ESCAPE_RULE > *(funny_escape_wchar_t_rule | FUNNY_ESCAPE_RULE | (qi::standard_wide::char_ - qi::standard_wide::char_(L"\"")))] > qi::lit(L"\""))
      | (qi::lit(L"\"") > qi::lexeme[*(javascript_escape_wchar_t_rule | UTF_ESCAPE_RULE | (qi::standard_wide::char_ - qi::standard_wide::char_(L"\"")))] > qi::lit(L"\"")) 
      | (qi::lit(L"\'") > qi::lexeme[*(javascript_escape_wchar_t_rule | UTF_ESCAPE_RULE | (qi::standard_wide::char_ - qi::standard_wide::char_(L"\'")))] > qi::lit(L"\'"))
    );
    
    json_wstring_rule = wstring_rule[qi::_val = phoenix::construct<JsonObject>(qi::_1)];

    int_rule = qi::int_[qi::_val = phoenix::construct<JsonObject>(qi::_1)];

    real_rule = qi::double_[qi::_val = phoenix::construct<JsonObject>(qi::_1)];

    bool_rule = bool_wchar_t_rule[qi::_val = phoenix::construct<JsonObject>(qi::_1)];

    null_rule = (qi::lit(L"null") | qi::eps);

    element_rule = (real_rule | int_rule | bool_rule | json_wstring_rule | array_rule | object_rule | null_rule);

    array_inner_rule = element_rule[phoenix::push_back(qi::_val, qi::_1)] > *(qi::lit(L",") > element_rule[phoenix::push_back(qi::_val, qi::_1)]);

    member_rule = (wstring_rule > qi::lit(L":") > element_rule)[qi::_val = phoenix::construct<JsonMember>(qi::_1,qi::_2)];

    object_inner_rule = member_rule[phoenix::push_back(qi::_val, qi::_1)] > *(qi::lit(L",") > member_rule[phoenix::push_back(qi::_val, qi::_1)]);

    object_rule = (qi::lit(L"{") > object_inner_rule > qi::lit(L"}"))[qi::_val = phoenix::construct<JsonObject>(qi::_1)] 
         | (qi::lit(L"{") > qi::lit(L"}"));  // Same as (-object_rule_inner)

    array_rule = (qi::lit(L"[") > array_inner_rule > qi::lit(L"]"))[qi::_val = phoenix::construct<JsonObject>(qi::_1)] 
           // Force to create zero length array. (Nor null_rule)
           | (qi::lit(L"[") > qi::lit(L"]"))[qi::_val = phoenix::construct<JsonObject>(zero_array)];
    
    json_rule = object_rule | array_rule;

    hex_rule = qi::hex;

    expression = qi::omit[hex_rule ^ qi::lit(L")]}'")] || json_rule;

    wstring_rule.name("wstring");
    int_rule.name("int");
    real_rule.name("real");
    bool_rule.name("bool");
    null_rule.name("null");
    element_rule.name("element");
    array_inner_rule.name("array_inner");
    member_rule.name("member");
    object_inner_rule.name("object_inner");
    object_rule.name("object");
    array_rule.name("array");

    ON_QI_ERROR(wstring_rule);
    ON_QI_ERROR(int_rule);
    ON_QI_ERROR(real_rule);
    ON_QI_ERROR(bool_rule);
    ON_QI_ERROR(null_rule);
    ON_QI_ERROR(element_rule);
    ON_QI_ERROR(array_inner_rule);
    ON_QI_ERROR(member_rule);
    ON_QI_ERROR(object_inner_rule);
    ON_QI_ERROR(object_rule);
  }
  
private:
  struct bool_wchar_t_ : qi::symbols<wchar_t const,bool>
  {
    bool_wchar_t_()
    {
      add
        (L"true" , true)
        (L"false", false)
    ;
    }
  } bool_wchar_t_rule;
  
  struct javascript_escape_wchar_t_ : qi::symbols<wchar_t const,wchar_t>
  {
    javascript_escape_wchar_t_()
    {
      add
        (L"\\b", '\b')
        (L"\  ", '  ')
        (L"\\v", '\v')
        (L"\\n", '\n')
        (L"\\r", '\r')
        (L"\\f", '\f')
        (L"\\\'", '\'')
        (L"\\\"", '\"')
        (L"\\\\", '\'')
        (L"\\0", '\0')
      ;
    }
  } javascript_escape_wchar_t_rule;

  struct funny_escape_wchar_t_ : qi::symbols<wchar_t const,wchar_t>
  {
    funny_escape_wchar_t_()
    {
      add
        (L"\'b", '\b')
        (L"\'t", '  ')
        (L"\'v", '\v')
        (L"\'n", '\n')
        (L"\'r", '\r')
        (L"\'f", '\f')
        (L"\'\'", '\'')
        (L"\'\"", '\"')
        (L"\'\\", '\'')
        (L"\'0", '\0')
      ;
    }
  } funny_escape_wchar_t_rule;

  //qi::rule<Iterator, void(std::wstring&), spc::space_type> hex_escape_base;
  //qi::rule<Iterator, std::wstring(), spc::space_type> hex_escape_rule;
  //qi::rule<Iterator, std::wstring(), spc::space_type> utf_escape_rule;
  //qi::rule<Iterator, std::wstring(), spc::space_type> funny_escape_rule;
  qi::rule<Iterator, std::wstring(), spc::space_type> wstring_rule;
  qi::rule<Iterator, std::wstring(), spc::space_type> hex_rule;
  qi::rule<Iterator, JsonObject(), spc::space_type> json_wstring_rule;
  qi::rule<Iterator, JsonObject(), spc::space_type> int_rule;
  qi::rule<Iterator, JsonObject(), spc::space_type> real_rule;
  qi::rule<Iterator, std::vector<JsonObject>(), spc::space_type>  array_inner_rule;
  qi::rule<Iterator, JsonObject(), spc::space_type> array_rule;
  qi::rule<Iterator, JsonObject(), spc::space_type> element_rule;
  qi::rule<Iterator, JsonMember(), spc::space_type> member_rule;
  qi::rule<Iterator, std::vector<JsonMember>(), spc::space_type> object_inner_rule;
  qi::rule<Iterator, JsonObject(), spc::space_type> object_rule;
  qi::rule<Iterator, JsonObject(), spc::space_type> bool_rule;
  qi::rule<Iterator, JsonObject(), spc::space_type> null_rule;
  qi::rule<Iterator, JsonObject(), spc::space_type> json_rule;
  qi::rule<Iterator, JsonObject(), spc::space_type> expression;
  std::vector<JsonObject> zero_array;
};


}// namespace GooglePlusLibrary
}// namespace Gplusnasite