A fine WordPress.com site

cpp

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;
}

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;
}

sqlite3でオンメモリDB

sqlite3 でスキーマ関係なく操作したい。オンメモリDBが便利。


#include <iostream>
#include <string>
#include <sqlite3.h>

int main() {
sqlite3* db = nullptr;
int resdb = sqlite3_open(":memory:", &db );
std::cout << resdb << std::endl;
sqlite3_stmt* stmt = nullptr;
sqlite3_prepare_v2( db, "select datetime('now','localtime')", -1, &stmt, 0 );
sqlite3_step( stmt );
std::cout << "type = " << sqlite3_column_type( stmt, 0 ) << std::endl;
std::cout << "value = " << sqlite3_column_text( stmt, 0 ) << std::endl;
sqlite3_finalize( stmt );
sqlite3_close( db );
return 0;
}

C++ レガシー文字列変換で気をつける事

 今更、何を書いてはんの?だとは思いますが、ついつい、うっかりしがちなんで


#include <iostream>
#include <string>

std::string get_string( const char* str ) {
std::string result = str;
return result;
}

int main() {
std::cout << get_string( nullptr ).size() << std::endl;
std::cout << " OK? " << std::endl;
return 0;
}

実行結果


terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct null not valid
Abort trap: 6

本日のげんなり TIFF編

 今日は参りました。 TIFFGetField という関数には、前回もやられているんですが、今回も、こてんこてんにやっつけられました。 TIFFTAG_GDAL_NODATA というタグの値を取得したくて、GDALのGeoTIFFパートを参考にコードを組んだら SIGSEGVの嵐。は〜 SIGSEGV、どんどん、ほぇー SIGSEGV、どんどん、ハイヤー SIGSEGV バンバン。


char* pszText = NULL;
if( TIFFGetField( hTIFF, TIFFTAG_GDAL_NODATA, &pszText ) )
{
bNoDataSet = TRUE;
dfNoDataValue = CPLAtofM( pszText );
}

突っ込んで面倒を見ていくと libtiff の tif_dir.c の int _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap) という関数でお亡くなりになっている事が判明しました。


// なんと、field_passcount > 0 が成立しているので
if (fip->field_passcount) {
if (fip->field_readcount == TIFF_VARIABLE2) {
// pszText にデータサイズが格納されて
*va_arg(ap, uint32*) = (uint32)tv->count;
} else /* Assume TIFF_VARIABLE */ {
*va_arg(ap, uint16*) = (uint16)tv->count;
}
// ありもしない第2の可変引数に値が格納されて
// ここであぼ~ん
*va_arg(ap, void **) = tv->value;
ret_val = 1;
}

(゚∀゚)アヒャ(゚∀゚)アヒャ。関数の仕様というか、TAGの仕様が変わっとるがなwww 知らねぇよヽ(`Д´)ノウワァァァン!! と言いながらコードを修正


uint32_t textLen = 0;
char* pszText = NULL;
if( TIFFGetField( hTIFF, TIFFTAG_GDAL_NODATA, &textLen, &pszText ) )
{
bNoDataSet = TRUE;
dfNoDataValue = CPLAtofM( pszText );
}

あれれ?まだまだ SIGSEGV おほー、どんどん SIGSEGV ひ~~。 更に突っ込んで面倒を見ていくと、同じく tif_dir.c にて


// えっ?今度は、field_passcount == 0
if (fip->field_passcount) {
//...
} else if (fip->field_tag == TIFFTAG_DOTRANGE
&& strcmp(fip->field_name,"DotRange") == 0) {
//...
} else {
// そして、field_type == TIFF_ASCII なので
if (fip->field_type == TIFF_ASCII
|| fip->field_readcount == TIFF_VARIABLE
|| fip->field_readcount == TIFF_VARIABLE2
|| fip->field_readcount == TIFF_SPP
|| tv->count > 1) {
// 第1引数 uint32_t にポインタ値が代入され
// 第2引数が放置プレーで、最終的にあぼ~ん
*va_arg(ap, void **) = tv->value;
ret_val = 1;
} else {
//...

 隊長!エスパーじゃないから、推定できましぇんヽ(`Д´)ノウワァァァン!!  ということで、とりあえず、2引数を取る形態で対処しました。


if (fip->field_type == TIFF_ASCII
|| fip->field_readcount == TIFF_VARIABLE
|| fip->field_readcount == TIFF_VARIABLE2
|| fip->field_readcount == TIFF_SPP
|| tv->count > 1) {
if( (tag == TIFFTAG_GDAL_METADATA) || (tag == TIFFTAG_GDAL_NODATA) ) {
*va_arg(ap, uint32*) = (uint32)strlen(tv->value);
}
*va_arg(ap, void **) = tv->value;
ret_val = 1;
} else {

 もの凄く疲れた。


ポリゴンの髭を取り除く

 標準に無い変形アルゴリズムを晒してみようと思います。


//! 指定間隔の隣接検索
/*!
@note std::adjacent_find の要素間隔指定バージョン
@retval 前方の要素検索位置
*/
template <class FORWARD_ITER, class BINARY_PREDICATE>
FORWARD_ITER interval_adjacent_find(
size_t interval, //!< [in] 間隔
FORWARD_ITER first, //!< [in] 先頭位置
FORWARD_ITER last, //!< [in] 終了位置
BINARY_PREDICATE pred //!< [in] 2項演算子
) {
size_t dist = std::distance( first, last );
if( dist <= interval ) return last;
FORWARD_ITER next;
if( interval < dist / 2 ) {
next = first;
for( size_t i = 0; i < interval; ++i ) ++next;
} else {
next = last;
for( size_t i = dist; i > interval; --i ) --next;
}
while( next != last ) {
if( pred( *first, *next ) ) return first;
++first; ++next;
}
return last;
}

//! 指定間隔の隣接検索
/*!
@note std::adjacent_find の要素間隔指定バージョン
@retval 前方の要素検索位置
*/
template <class FORWARD_ITER>
FORWARD_ITER interval_adjacent_find(
size_t interval, //!< [in] 間隔
FORWARD_ITER first, //!< [in] 先頭位置
FORWARD_ITER last //!< [in] 終了位置
) {
size_t dist = std::distance( first, last );
if( dist <= interval ) return last;
FORWARD_ITER next;
if( interval < dist / 2 ) {
next = first;
for( size_t i = 0; i < interval; ++i ) ++next;
} else {
next = last;
for( size_t i = dist; i > interval; --i ) --next;
}
while( next != last ) {
if( *first == *next ) return first;
++first; ++next;
}
return last;
}

//! 指定間隔の隣接検索
/*!
@note std::adjacent_find の要素間隔指定バージョン
@retval 後方の要素検索位置
*/
template <class FORWARD_ITER, class BINARY_PREDICATE>
FORWARD_ITER interval_adjacent_find_later(
size_t interval, //!< [in] 間隔
FORWARD_ITER first, //!< [in] 先頭位置
FORWARD_ITER last, //!< [in] 終了位置
BINARY_PREDICATE pred //!< [in] 2項演算子
) {
size_t dist = std::distance( first, last );
if( dist <= interval ) return last;
FORWARD_ITER next;
if( interval < dist / 2 ) {
next = first;
for( size_t i = 0; i < interval; ++i ) ++next;
} else {
next = last;
for( size_t i = dist; i > interval; --i ) --next;
}
while( next != last ) {
if( pred( *first, *next ) ) return next;
++first; ++next;
}
return last;
}

//! 指定間隔の隣接検索
/*!
@note std::adjacent_find の要素間隔指定バージョン
@retval 後方の要素検索位置
*/
template <class FORWARD_ITER>
FORWARD_ITER interval_adjacent_find_later(
size_t interval, //!< [in] 間隔
FORWARD_ITER first, //!< [in] 先頭位置
FORWARD_ITER last //!< [in] 終了位置
) {
size_t dist = std::distance( first, last );
if( dist <= interval ) return last;
FORWARD_ITER next;
if( interval < dist / 2 ) {
next = first;
for( size_t i = 0; i < interval; ++i ) ++next;
} else {
next = last;
for( size_t i = dist; i > interval; --i ) --next;
}
while( next != last ) {
if( *first == *next ) return next;
++first; ++next;
}
return last;
}

//! 指定間隔の隣接検索
/*!
@note std::adjacent_find の INTERVAL 要素間隔バージョン
@retval イテレータ(要素検索位置)
*/
template <class FORWARD_ITER, class BINARY_PREDICATE>
FORWARD_ITER interval_adjacent_rotate_find(
size_t interval, //!< [in] 間隔
FORWARD_ITER first, //!< [in] 先頭位置
FORWARD_ITER last, //!< [in] 終了位置
BINARY_PREDICATE pred //!< [in] 2項演算子
) {
size_t dist = std::distance( first, last );
if( dist <= interval ) return last;
FORWARD_ITER result = interval_adjacent_find( interval, first, last, pred );
if( result != last ) return result;
return interval_adjacent_find_later( dist - interval, first, last, pred );
}

//! 指定間隔の隣接検索
/*!
@note std::adjacent_find の INTERVAL 要素間隔バージョン
@retval イテレータ(要素検索位置)
*/
template <class FORWARD_ITER>
FORWARD_ITER interval_adjacent_rotate_find(
size_t interval, //!< [in] 間隔
FORWARD_ITER first, //!< [in] 先頭位置
FORWARD_ITER last //!< [in] 終了位置
) {
size_t dist = std::distance( first, last );
if( dist <= interval ) return last;
FORWARD_ITER result = interval_adjacent_find( interval, first, last );
if( result != last ) return result;
return interval_adjacent_find_later( dist - interval, first, last );
}

何に使うかというと、—ABA— みたいな構成のポリゴンは、髭のように変な辺が飛び出しているので、それを消去するのに使います。–ABCBA–みたいなパターンもあるので、–ABA– を消去しても油断できません。地道に再帰で消し去ります。


//! 単純な連続重複があるか調べる
/*!
@retval true 重複あり
@retval false 重複なし
*/
template <typename T>
bool check_duplicate( const vector<T>& sec ) {
return (std::adjacent_find( sec.begin(), sec.end() ) != sec.end());
}

//! 単純な連続重複点を除去する
/*!
@note 先頭と末尾は連続としない
*/
template <typename T>
void deduce_duplicate( vector<T>& sec ) {
vector<T>::iterator f = std::adjacent_find( sec.begin(), sec.end() );
while( f != sec.end() ) {
sec.erase( f );
f = std::adjacent_find( sec.begin(), sec.end() );
}
}

//! 単純な連続重複があるか調べる
/*!
@retval true 重複あり
@retval false 重複なし
*/
template <typename T>
bool check_closed_duplicate( const vector<T>& sec ) {
if( sec.size() < 3 ) throw std::exception();
return check_duplicate( sec ) || (*(sec.begin()) == *(sec.rbegin()));
}

//! 単純な連続重複点を除去する
/*!
@note 先頭と末尾を連続とする
*/
template <typename T>
void deduce_closed_duplicate( vector<T>& sec ) {
if( sec.size() < 3 ) throw std::exception();
deduce_duplicate( sec );
if( *(sec.begin()) == *(sec.rbegin()) ) sec.pop_back();
}

//! ABAタイプの無駄な尾を除去する
/*!
@note ポリラインに使用する
*/
template <typename T>
void deduce_tail( vector<T>& sec ) {
vector<T>::iterator f = interval_adjacent_find( 2, sec.begin(), sec.end() );
while( f != sec.end() ) {
vector<T>::iterator g = f;
++g; sec.erase( g ); sec.erase( f );
f = interval_adjacent_find( 2, sec.begin(), sec.end() );
}
}

//! ABAタイプの無駄な尾を除去する
/*!
@note ポリゴンに使用する
*/
template <typename T>
void deduce_closed_tail( vector<T>& sec ) {
vector<T>::iterator f = interval_adjacent_rotate_find( 2, sec.begin(), sec.end() );
while( f != sec.end() ) {
vector<T>::iterator g = f;
++g;
if( g == sec.end() ) {
sec.erase( f ); sec.erase( sec.begin() );
} else {
sec.erase( g ); sec.erase( f );
}
f = interval_adjacent_rotate_find( 2, sec.begin(), sec.end() );
}
}

あんま、おもしろくないですかね。


std::move ではまった事

 いまの所、std::move ではまった事なぞを、思い出せる範囲で書いてみようと思います。

 直近では、ndk での話ですが、std::unique に move constructor と move operator しか持たないクラスの deque をかけると、見事にデータが壊れました。move に一部対応している状況なので、文句は言えません。自前で move 用の unique をこさえました。特に、このバグは場所を特定できるまでに凄い時間がかかりました。どこで壊れているのか探すのも大変でした。

 vector を std::move にかけて移動させると、要素が倍で増えました。これは、move 後の変数の状態は不定なので、move した後にも残骸が残っており、残骸要素が加算されていくというバグでした。move した後に clear() をコールする事で回避しました。

move constructor だけでなく、copy constructor も追加したら、copy が優先されて、予期せぬ挙動を引き起こしました。copy constructor は封印して、copy ファンクタを利用するようなアルゴリズムをこさえる事で回避しました。

一応、こんなところでしょうか?


本日のバグ 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って事でした。


CentOS に libmemcached をインストール

 rpmforge から入れろとか、情報がありますが、libmemcache-devel までは入るんですが、肝心の libmemcached が影も形も無い。ほぇー。ま、こんな時は、ソースからコンパイルやね。


$ wget https://launchpad.net/libmemcached/1.0/1.0.16/+download/libmemcached-1.0.16.tar.gz
$ sudo mv libmemcached-1.0.16.tar.gz /usr/local/src
$ su
# tar xvf libmemcached-1.0.16.tar.gz
# cd libmemcached-1.0.16
# ./configure --prefix=/usr
# make

はい、tr1/cstdint が無いと怒られます。モンキーパッチで対応です


# vi libmemcached-1.0/memcached.h

こんな感じに修正


#ifdef __cplusplus
//# include <tr1/cinttypes>
# include <inttypes.h>
#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## UL)
#endif
# include <cstddef>
# include <cstdlib>
#else
# include <inttypes.h>
# include <stddef.h>
# include <stdlib.h>
# include <stdbool.h>
#endif

気をとりなおして


# make
# make test
# make install

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

本日のバグTIFF編

本日のバグの紹介です。
TIFF の情報を調べるクラスを作っていて


class tiffinfo {
private:
uint32_t image_width_;
uint32_t image_height_;
uint16_t tile_width_;
uint16_t tile_height_;
uint16_t samples_per_pixel_;
...
};

みたいなメモリレイアウトになってたんですわ。
LibTIFFのAPI 設計には、いろいろと不満たらたらで、かなりフラストレーションたまってます。この中に TIFF の TAG値を取得するAPIがあって、

extern int TIFFGetField(TIFF* tif, uint32 tag, ...);

という形式なんです。
で、いろんなタグがあるんですが、サイズがよくわからない。まぁ、サイズがよくわからないのは、ドキュメントをちゃんと読んでないのバレバレなんですけどね(>_<)


if( 1 != TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel_) ) {
...
}
...
TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tile_width_);
TIFFGetField(tif, TIFFTAG_TILELENGTH, &tile_height_);

はい、勘の良い人ならわかったでしょうか?実は、tile_width_ と tile_height_ は、uint32_t じゃないといかんのでした。
まずい事に、リトル・エンディアンだと、その箇所のサイズを間違った事を簡単に気が付きません。
ウィンドウズだとアライメントが 32bit なんで、この問題は表面化しません。ndk で開発してると、アライメントが 16bit あたりだったんでしょうね〜。tile_height_ を読みだした瞬間に samples_per_pixel_ のメモリ領域に上位 16bit の値 0 で上書きですわ。 怖い怖い。


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

以下のようなポストを 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"\", '')
;
}
} 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", '')
;
}
} 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"\", '')
;
}
} 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", '')
;
}
} 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

ADT で nullptr nullptr 言うな

 はい、Android NDK における eclipse 環境の話です。

 規格に準拠した書き方しといた方がええだろうと思って、NULL と書かないで nullptr と書いたら、eclipse さんに「nullptr なんてしらねーよ」とか、「std::move なんて関数ありませんことよ!」という感じで、編集する度にエラーにされて、そいつらを手動で除去してやらないと、オチオチとコンパイルもできません。

 ググったら、結構、困っている人いるみたいなんで、すぐに修正されるような気もするんですが、なかなか修正されない。 修正マダァ?(・∀・ )っ/凵⌒☆チンチン
 という訳で、これを回避するためのADTの設定です。 ADT -> 環境設定 を開いて、不要なエラーチェックを無効にします。


PREPROCESSOR と enum

android ndk を使っていて ログを出力するかどうか、プリプロセッサで制御しとこうと思い


#include <boost/preprocessor/comparison/greater_equal.hpp>
#include <jni.h>
#include <android/log.h>

#define LOG_LEVEL ANDROID_LOG_INFO

void hoge () {
# if BOOST_PP_GREATER_EQUAL(ANDROID_LOG_DEBUG,LOG_LEVEL)
__android_log_print(ANDROID_LOG_DEBUG, "HOGE", "hoge");
# endif
...
}

なんてやったら、


記述 リソース パス ロケーション タイプ
missing binary operator before token "BOOST_PP_IIF_BOOST_PP_BOOL_ANDROID_LOG_INFO"

なんてエラーになったんですわ。ほぇ??? android/log.h を見たら


/*
* Android log priority values, in ascending priority order.
*/
typedef enum android_LogPriority {
ANDROID_LOG_UNKNOWN = 0,
ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */
ANDROID_LOG_VERBOSE,
ANDROID_LOG_DEBUG,
ANDROID_LOG_INFO,
ANDROID_LOG_WARN,
ANDROID_LOG_ERROR,
ANDROID_LOG_FATAL,
ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */
} android_LogPriority;

ははーん、enum は、あくまで enum なんで、プリプロセッサでは integer として展開されないんですね。 という訳で、


#define M_ANDROID_LOG_UNKNOWN 0
#define M_ANDROID_LOG_DEFAULT 1 /* only for SetMinPriority() */
#define M_ANDROID_LOG_VERBOSE 2
#define M_ANDROID_LOG_DEBUG 3
#define M_ANDROID_LOG_INFO 4
#define M_ANDROID_LOG_WARN 5
#define M_ANDROID_LOG_ERROR 6
#define M_ANDROID_LOG_FATAL 7
#define M_ANDROID_LOG_SILENT 8 /* only for SetMinPriority(); must be last */

#define LOG_LEVEL M_ANDROID_LOG_INFO

として、定数は、M_ 付きにしました。だっせー。 まぁ、template メタ関数にして回避しても良いんですけどね…


std::chrono と boost::posix_time::ptime

 boost::asio::io_service のキャンセル処理を考えていて、キャンセル・フラグでキャンセルしようと思っていたんですが、考えてみたらキャンセル・フラグを戻すタイミングも難しいよなーと気がつきました。  std::chrono ちょっと斜に構えた感じもするので、まずは boost::posix_time::ptime でキャンセル時刻を記録しておき、io_service::post した時刻と比較して、キャンセル時刻が新しければ、キャンセル処理を行うという風にしようと…。ところが ptime 秒単位なんで、処理が立て込んでいると、いつのキャンセルなんだか全くわからないという事態に…。  以下のコードの出力結果は、完全に環境依存なんでしょうけど、立て込んでいる状況(1秒間にキャンセルが2回以上ある状況)でキャンセル時刻で判断しようと思ったら、やっぱ chrono で処理するのが妥当なのかなぁと…。


#include <iostream>
#include <chrono>
#include <boost/date_time/posix_time/posix_time.hpp>

int main() {

boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time();
std::cout << "hoge" << std::endl;
boost::posix_time::ptime pt2 = boost::posix_time::second_clock::local_time();

std::cout << pt << std::endl;
std::cout << (pt2 - pt).total_milliseconds() << std::endl;

auto tp = std::chrono::system_clock::now() ;
std::cout << "hoge" << std::endl;
auto tp2 = std::chrono::system_clock::now();
std::cout << (tp2-tp).count() << std::endl;

return 0;
}

mac 環境 gcc4.7 での実行結果


hoge
2013-Jan-03 16:17:06
0
hoge
2

boost::asio::io_service と cancel

なんか、以下のようなコードのコンパイルが通らなくて、???てなってたんですわ。


void foo( const boost::system::error_code& error ) {
if( error ) {
// キャンセル操作
} else {
// 通常操作
}
}

int main() {
boost::asio::io_service service;

service.post( boost::bind( foo, boost::asio::placeholders::error ) );

return 0;
}

えーっ?なんでー?と思ったら、そもそも boost::asio::io_service には、cancel 操作も無ければ、キューに溜め込んだ handler をクリアする仕組みも無いみたいで。stackoverflow には、こんなワークアラウンドが…


void clear( boost::asio::io_service& service )
{
service.stop();
service.~io_service();
new( &service ) boost::asio::io_service;
}

見ての通り、プレスメント・コンストラクタ使って強引にクリアしてます。いや、まぁ、いいけど…。なんでキャンセルなりクリアなりの操作が無いんだろうか?ちょっと納得がいかない…。  こっちのんが、まだ抵抗感は少ないけど、同じですね。


std::auto_ptr service( new boost::asio::io_service );

...
service.reset( new boost::asio::io_service );

2013/1/3 追記: 結局キャンセル処理は、クラスメンバ関数を bind させて、クラスメンバのフラグで制御する事にしました。以下のような感じのコード


class Foo {
private:
bool canceled_;
private:
void a_handler() {
if( canceled_ ) {
// キャンセル処理
} else {
// 通常処理
}
}
public:
Foo() : canceled_(false) {}
};

...

Foo f;
service.post( std::bind( &Foo::a_handler, &f ) );

std::move と asio

いやー、C++11 素晴らしいですね〜。 とりあえず、頭に描いたシナリオどおりに事が運ぶか、実験くんしてみました。 シナリオは、

  1. 所有権のあるコピーできない Foo クラスがあり
  2. ref では、まずいので、shared_ptr で asio のハンドラに Foo を保持させ
  3. io_service で処理されたら所定の vector へ move しながら Foo をぶっ込む
  4. へっへっへっ、リソース管理しなくても、適当に処理できるぜ!

#include <iostream>
#include <vector>
#include <boost/bind.hpp>
#include <boost/range/algorithm/for_each.hpp>
#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/ref.hpp>

class Foo {
private:
int n_;
public:
Foo() : n_() {}
Foo(int n) : n_(n) {
std::cout << "Foo(" << n << ");" << std::endl;
}

Foo(Foo&& f) : n_(f.n_) {
f.n_ = 0;
}

~Foo() { std::cout << "~Foo(); /* " << n_ << " */" << std::endl; }

Foo& operator = (Foo&& rhs) { n_ = rhs.n_; rhs.n_ = 0; return *this; }

int n() const { return n_; }
};

void post_move( boost::shared_ptr<Foo> f, std::vector<Foo>& v ) {
std::cout << "post_move push_back : " << f.get()->n() << std::endl;
v.push_back( std::move( *f.get() ) );
}

int main() {
boost::asio::io_service service;
std::vector<Foo> v;

for( int i = 0; i < 10; ++i ) {
Foo f(i+1);
boost::shared_ptr<Foo> nf( new Foo( std::move(f) ) );
service.post( boost::bind( post_move, nf, boost::ref(v) ) );
}

std::cout << ">>> run! <<<" << std::endl;
service.run();

std::cout << ">>> done! <<<" << std::endl;

boost::for_each( v, [](const Foo& f) { std::cout << f.n() << std::endl; } );

return 0;
}

結果


Foo(1);
~Foo(); /* 0 */
Foo(2);
~Foo(); /* 0 */
Foo(3);
~Foo(); /* 0 */
Foo(4);
~Foo(); /* 0 */
Foo(5);
~Foo(); /* 0 */
Foo(6);
~Foo(); /* 0 */
Foo(7);
~Foo(); /* 0 */
Foo(8);
~Foo(); /* 0 */
Foo(9);
~Foo(); /* 0 */
Foo(10);
~Foo(); /* 0 */
>>> run! <<<
post_move push_back : 1
~Foo(); /* 0 */
post_move push_back : 2
~Foo(); /* 0 */
~Foo(); /* 0 */
post_move push_back : 3
~Foo(); /* 0 */
~Foo(); /* 0 */
~Foo(); /* 0 */
post_move push_back : 4
~Foo(); /* 0 */
post_move push_back : 5
~Foo(); /* 0 */
~Foo(); /* 0 */
~Foo(); /* 0 */
~Foo(); /* 0 */
~Foo(); /* 0 */
post_move push_back : 6
~Foo(); /* 0 */
post_move push_back : 7
~Foo(); /* 0 */
post_move push_back : 8
~Foo(); /* 0 */
post_move push_back : 9
~Foo(); /* 0 */
~Foo(); /* 0 */
~Foo(); /* 0 */
~Foo(); /* 0 */
~Foo(); /* 0 */
~Foo(); /* 0 */
~Foo(); /* 0 */
~Foo(); /* 0 */
~Foo(); /* 0 */
post_move push_back : 10
~Foo(); /* 0 */
>>> done! <<<
1
2
3
4
5
6
7
8
9
10
~Foo(); /* 1 */
~Foo(); /* 2 */
~Foo(); /* 3 */
~Foo(); /* 4 */
~Foo(); /* 5 */
~Foo(); /* 6 */
~Foo(); /* 7 */
~Foo(); /* 8 */
~Foo(); /* 9 */
~Foo(); /* 10 */

std::move と std::set_difference

 ウィンドウズ系のプログラムは、win2k をサポートしないといけないとかいう理由で、vc8 を変える訳にはいかないのであった。そんな理由から、C++03 以外に選択肢が無い現状なのであった。  ただ、今回 android ndk でコードを書いてまして、所有権のあるクラスを管理する事になりました。そうなんです。コピー禁止で、std::move が、使いたくて使いたくてしょうがない症候群。これ、今までだと、リソースをマネージャクラスに保持させて管理するとかいう設計にしなくてはならず、スレッドが絡んでくると煩雑になってしょうがない部分でした。  android ndk r8b なんか Foo::Foo( Foo&& foo ) とかしてもコンパイル通るし、いろいろ調べてると、どうも c++11も使えるっぽい。まじめに gcc の状況を見たら、gcc-4.4.3 と gcc-4.6 が入っていて、gcc-4.6 の gnu-stl だと、まさに表にある通りで -std=gnu++0x のオプションでも一部機能には対応していました。ヘッダーの中身を確認しましたが、std::swap も std::move で実装されてます。  と、ここで std::set_difference の move を使うバージョンみたいなんが欲しくなって、実装してみました。コンパイルが通ってしまったんで、ついつい嬉しくなって、晒してみる事に…。あくまで、コンパイルが通っただけなんで、動作の保証はありません。はい。


#pragma once
#ifndef MOVE_DIFFERENCE_HPP
#define MOVE_DIFFERENCE_HPP

template<typename ITER1, typename ITER2>
ITER2 move(
ITER1 first1, ITER1 last1,
ITER2 first2
) {
while( first1 != last1 ) {
*first2 = std::move( *first1 );
++first1; ++first2;
}
return first2;
}

template<typename ITER1, typename ITER2, typename ITER3>
void move_difference(
ITER1& first1, ITER1 last1,
ITER2 first2, ITER2 last2,
ITER3& first3
) {
ITER1 pos1 = first1;
while( pos1 != last1 ) {
if( first2 == last2) {
first3 = std::move(pos1, last1, first3);
return;
}
if( *pos1 < *first2 ) { // 取り除く候補
*first3 = std::move( *pos1 );
++pos1;
++first3;
} else if( *first2 < *pos1 ) { // 関係無い候補はスキップ
++first2;
} else { // 等しいので双方インクリメント
std::swap( *first1, *pos1 );
++first1; ++pos1;
++first2;
}
}
return;
}

template<typename ITER1, typename ITER2, typename ITER3, typename COMP>
void move_difference(
ITER1& first1, ITER1 last1,
ITER2 first2, ITER2 last2,
ITER3& first3, COMP ope
) {
ITER1 pos1 = first1;
while( pos1 != last1 ) {
if( first2 == last2) {
first3 = std::move(pos1, last1, first3);
return;
}
if( ope( *pos1, *first2) ) { // 取り除く候補
*first3 = std::move( *pos1 );
++pos1;
++first3;
} else if( ope( *first2, *pos1 ) ) { // 関係無い候補はスキップ
++first2;
} else { // 等しいので双方インクリメント
std::swap( *first1, *pos1 );
++first1; ++pos1;
++first2;
}
}
return;
}

#endif // MOVE_DIFFERENCE_HPP

Android ndk 突っ込んでます

 忙しいとかで、ブログの更新も滞ってます。一応、アウトプットもしておかないと…。
最近は、Android ndk を突っ込んでます。まぁ、Java では限界があるんです。Java で大規模開発した事が無いので、パッケージの構成とかも失敗しました。もうちょい、ちゃんとパッケージを分けて作っておくんだったと…。モジュールの分離が、なかなか難しくて四苦八苦してたのも事実としてあります。

 ndk の情報で有益なサイトを見つけました。

  1. Windows 環境にて Android アプリを Eclipse と Cygwin を使わずにビルドする。
  2. Android NDKの中身はどうなっている? – アプリの定義を記す「Application.mk」 
  3. ファイルやライブラリの情報を定義する「Android.mk」

です。(1.)の構成は、Linux や mac の環境でも同じ事が言えます。android-cmake を使って楽したいです。(2.)(3.)Android NDK に付属のドキュメントを眺めましたが、書いてある事が要領を得ない感じでピンと来ませんでした。実際、適当に書いてると、ディレクトリの構成と Application.mk や Android.mk の配置で嵌りました。NDK のドキュメントには、jni ディレクトリ下の Application.mk が option であるかのような記述がされてますが、APP_ABI を指定できるのは、jni 直下の Application.mk だけであり、プロジェクト直下の Application.mk に記述しても丸無視されます。NDKの必要なポイントがコンパクトに記述されていて、分かりやすいです。

 しばらく ndk の話題が続きそう…


ATL-ISAPI の受難

 いやー、出るわ出るわ、どんどん風化しますわ。 まじ、ウィンドウズ上で、ATLとかWTLとかWCFとかWPFとか、もう使いたくないわwww。 ATLISAPI を利用した Soapサービスを C++ でゴリゴリ書いたんですが、捨てられる捨てられる。その捨てられっぷりが見事で、IIS7になったら、まともに動作しないwww。  デバッグしようと思っても、プロセスが開始されず、アタッチもされないし、プロセス、即終了するしwww。 どないせぇちゅうねん。たまたま、Soap じゃない ISAPI.dll も作ってて、そっちは動いてたんで、同じ名前のアプリケーション・プールでそっちを動かしてプロセス・アタッチする事で、手がかりは掴めました。  原因は、ここに書いてあるような事で、とにかく、おかしい。リソース・リークしてるかもしれんけど、デバッグできんので、下のように修正してデバッグを続ける事に・・・。


~CRevertThreadToken() throw()
{
// should have been Restore()'d by now.
#ifdef _DEBUG
  // *****BUG****
  // if(m_hThreadToken != INVALID_HANDLE_VALUE) DebugBreak();
#endif
}

 おかしい、トレースしている範囲では、特におかしそうな所は無さそう…だけど、ハンドラが全く呼ばれない!でも、当たりを付けて探ったら、見つけました。Code Plex の方に情報が! あー、思い当たる節あるわ…つい先日、リソースハンドルがNULLで(#^ω^)ってなってたのと、同じや。 とりあえず、疲れた。


gdal patch 結末

 前回投下したパッチですが、-optfile というオプション自体をテキストファイルで受け渡すオプション(ややこしい)が追加されており、これを利用すると、UTF-8の文字コードでオプションを渡しても文字化けが起きないので、パッチは不要という事になりました。  この方法は確かにスマートで、自分も base64 でオプションを指定するオプションとか、似たような事を考えてました。UTF-8でオプションが使える事の利点は、QGISなどの既にマルチ言語で動作しているアプリケーションから、複数の言語をチャンポンにして扱える事が挙げられます。  チケットでのディスカッションは、こちら。なかなか話が通じなくて、困りました。多分、どちらも、そう思っていた事でしょう。  ま、自分の投下したパッチも、まるっきり無駄では無くて、コンソール画面にエラーを出力する場合には利用できると思います。ただ、クリティカルでは無いので、取り込まなくても支障は無いでしょう。とりあえず、何のためにあるねん chcp 65001 アホけ?という辺りで締めたいと思います。


GDAL patch 投下

 とりあえず、QGisのコミュニティのCavaliniさんに、パッチを渡してみましたが、QGis の問題というよりもGDALの問題なんで、GDAL-developer ML に投下した方が良いのかも?  ただ前回、短いpatchだからOKかも?と思ってGDAL-dev MLにパッチ投稿したら、MLへのpatch投下は、やっぱり遠慮して欲しいと言われたので、説明をした上で、どなたかにパッチを送るという手順になりそう。 アカウントは登録されているはずなんだけど、OSGeo の track にログインできないので、track に直接投下できなくて、困ってるのだ…。 パッチは、version ‘gdal-2.0dev’ https://svn.osgeo.org/gdal/trunk/gdal のもので、新しくコマンドライン引数を管理するクラスが生成されていたので、ちょこっと直すだけで、コマンドライン型アプリ全部に適用されそうです。


*** ogr/ogrutils.cpp Fri Nov 2 10:47:34 2012
--- ../gdal_new/ogr/ogrutils.cpp Fri Nov 2 12:28:33 2012
***************
*** 754,760 ****
/* -------------------------------------------------------------------- */
else
{
! papszReturn = CSLAddString( papszReturn, papszArgv[iArg] );
}
}

--- 754,762 ----
/* -------------------------------------------------------------------- */
else
{
! char* pszTmp = CPLRecodeCommandInput( papszArgv[iArg] );
! papszReturn = CSLAddString( papszReturn, pszTmp );
! CPLFree(pszTmp);
}
}

*** port/cpl_string.h Fri Nov 2 10:47:29 2012
--- ../gdal_new/port/cpl_string.h Fri Nov 2 12:29:27 2012
***************
*** 177,182 ****
--- 177,184 ----
const char *pszDstEncoding ) CPL_WARN_UNUSED_RESULT;
int CPL_DLL CPLIsUTF8(const char* pabyData, int nLen);
char CPL_DLL *CPLForceToASCII(const char* pabyData, int nLen, char chReplacementChar) CPL_WARN_UNUSED_RESULT;
+ char CPL_DLL *CPLRecodeCommandInput( const char* pszSource ) CPL_WARN_UNUSED_RESULT;
+ char CPL_DLL *CPLRecodeCommandOutput( const char* pszSource ) CPL_WARN_UNUSED_RESULT;

CPL_C_END

*** port/cpl_recode.cpp Fri Nov 2 10:47:30 2012
--- ../gdal_new/port/cpl_recode.cpp Fri Nov 2 12:16:08 2012
***************
*** 324,329 ****
--- 324,372 ----
return -1;
}

+
+ /************************************************************************/
+ /* CPLRecodeCommandInput() */
+ /************************************************************************/
+ /**
+ * Convert a string from a platform encoding to UTF-8, effects only windows platform.
+ *
+ * There is a I/O problem in windows command line character arguments.
+ * Unfortunately, Run batch file written in UTF-8 fails some case.
+ *
+ * @return a NULL terminated string which should be freed with CPLFree().
+ */
+
+ char CPL_DLL *CPLRecodeCommandInput( const char* pszSource )
+
+ {
+ #ifdef _WIN32
+ return CPLRecode( pszSource, "CP0", CPL_ENC_UTF8 );
+ #else
+ return CPLStrdup(pszSource);
+ #endif
+ }
+
+ /************************************************************************/
+ /* CPLRecodeCommandOutput() */
+ /************************************************************************/
+ /**
+ * Convert a string from UTF-8 to a platform encoding, effects only windows platform.
+ *
+ * There is a I/O problem in windows command line character arguments.
+ *
+ * @return a NULL terminated string which should be freed with CPLFree().
+ */
+ char CPL_DLL *CPLRecodeCommandOutput( const char* pszSource )
+
+ {
+ #ifdef _WIN32
+ return CPLRecode( pszSource, CPL_ENC_UTF8, "CP0" );
+ #else
+ return CPLStrdup(pszSource);
+ #endif
+ }
+
/************************************************************************/
/* CPLClearRecodeWarningFlags() */
/************************************************************************/
*** port/cpl_recode_stub.cpp Fri Nov 2 10:47:29 2012
--- ../gdal_new/port/cpl_recode_stub.cpp Fri Nov 2 11:43:30 2012
***************
*** 166,172 ****
&& strcmp(pszDstEncoding,CPL_ENC_UTF8) == 0 )
{
int nCode = atoi( pszSrcEncoding + 2 );
! if( nCode > 0 ) {
return CPLWin32Recode( pszSource, nCode, CP_UTF8 );
}
}
--- 166,172 ----
&& strcmp(pszDstEncoding,CPL_ENC_UTF8) == 0 )
{
int nCode = atoi( pszSrcEncoding + 2 );
! if( nCode >= 0 ) {
return CPLWin32Recode( pszSource, nCode, CP_UTF8 );
}
}
***************
*** 178,184 ****
&& strncmp(pszDstEncoding,"CP",2) == 0 )
{
int nCode = atoi( pszDstEncoding + 2 );
! if( nCode > 0 ) {
return CPLWin32Recode( pszSource, CP_UTF8, nCode );
}
}
--- 178,184 ----
&& strncmp(pszDstEncoding,"CP",2) == 0 )
{
int nCode = atoi( pszDstEncoding + 2 );
! if( nCode >= 0 ) {
return CPLWin32Recode( pszSource, CP_UTF8, nCode );
}
}

2012/11/05 追記:やっぱ、GDAL-dev ML に投下しました。


Windows CMD args character conversion problem.

 ウィンドウズ環境におけるコマンドプロンプトの問題を説明するために、簡単なプログラムを書いてみました。ここが理解できないと、パッチが受け入れられないだろうとおもったので・・・


//
// 'Command Prompt Argument' check program
//
// To compile, type below
//
// cl /EHa /GR /MD chkarg.cpp
//

#include <iostream>
#include <iomanip>


void showHex(const char* str) {
for( const unsigned char* p = reinterpret_cast<const unsigned char*>(str); *p != 0; ++p ) {
std::cout << std::hex << "0x" << (int)*p << " ";
}
std::cout << std::endl;
}


int main(int argc, char* argv[]) {
if( argc <= 1 ) return 1;

showHex(argv[1]);

return 0;
}

これを実行するバッチファイルは、こんなんです。


@echo off
echo Bad case UTF-8 arg command check
echo This text file was written in UTF-8 with Kanji.
echo result must be
echo 0xe5 0x85 0x88
echo ===> run chkarg.
chkarg 先

 実行結果は


Bad case UTF-8 arg command check
This text file was written in UTF-8 with Kanji.
result must be
0xe5 0x85 0x88
0xe5 0x85 0x81 0x45

となります。chcp 65001 を行なっても状況に変わりはありません。


今時廃れた ISAPI Extension dll ではまる。

 Visual Studio 2005 から IIS の ISAPI Extension のウィザードが消失しました。しかし、一応 CHttpServer が残ってたんで、そっちを使ってたんですが、リソースのロードができない。 デバッガで追ってると、AfxGetResourceHandle() が NULL を返してきます。なんじゃこれ? DLLMain は既に定義されていて、自前で、ここの制御が不可能な状態に持ってきて、hInstance が、どこにも保存されていないなんて、何の罰ゲームだよ?とぼやきながら、なんやかんやと、半日潰しました(環境整えたり、原因調べたりで)。  結局、Hoge.dll という ISAPI Extension だったとすると、


static HINSTANCE g_hInstance;
HINSTANCE AhoGetResourceHandle() { return g_hInstance; }
...

CHogeExtension::CHogeExtension() {
...
g_hInstance = GetModuleHandle("hoge.dll");
}

と、こんな感じの対応でいけました。