Boost総合スレ part10 (385レス)
前次1-
抽出解除 レス栞

リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
214
(2): 2014/10/26(日)12:18 ID:/US9w/Z3(1) AAS
Boost spirit qiの、grammarに設定するinherited attributeについて
どうしても分からない点があるので、質問します。

* ソースコードとエラーメッセージ全文 *
外部リンク:pastebin.com

コンパイラはVS2013 Pro Update3 の cl.exe (バージョン18.00.30723)
boostのパッケージはバージョン1.55(7zip版)です。

inherited attributeとして自作の構造体を使用したいと思い
qi::grammarのSignatureの引数部に自作の構造体を設定したところ
「その構造体にresultの定義がない」というエラーメッセージが起きコンパイルが失敗しました。

構造体の代わりにstd::string(resultというメンバは持っていないはず)を使用すると
問題なくコンパイルが通るので、inherited attributeに設定できる型に何か制約があるようにも思えるのですが
boost.orgのドキュメントからはそれらしき記述が見つけられず、エラーメッセージを見ても私にはわかりませんでした。
海外含めて関連する情報がないか探したのですが(boost spirit qi inherited attribute requirement 等で検索)
解決策を見つけられませんでした。

inherited attributeに使用できる型の制約条件や、類似のコンパイルエラーとその対処方法をご存じであれば
教えていただきたく思います。
216
(1): 2014/10/27(月)22:32 ID:DoYepSGR(1) AAS
>>214
エラー以前になんかInherited attributesの使い方と使いどころを基本から間違っていないか?
ここの例を見る限り 外部リンク[html]:www.boost.org
正規表現での後方参照みたいに一つのルール内でサブルールにマッチした結果によって
挙動を変えるルールを記述するときに使うものじゃないか?
218
(1): 2014/10/30(木)00:07 ID:lLBGJ4gC(1) AAS
>>214,217
いまさらだがわかった範囲で言っておくと

Inherited attributes に対する条件には
外部リンク[html]:www.boost.org

> Some parsers (e.g. primitives and non-terminals) may take in additional attributes. Such parsers take the form:
> p(a1, a2,..., aN)
> where p is a parser. Each of the arguments (a1 ... aN) can either be an immediate value, or a function, f, with signature:
> T f(Unused, Context)
> where T, the function's return value, is compatible with the argument type expected and Context is the parser's Context type
> (The first argument is unused to make the Context the second argument. This is done for uniformity with Semantic Actions).
があって
その immediate value の判定は boost::is_scalar か boost::spirit::traits::is_string のどちらかが真であるかで判定されてる。

けれど MyStruct はそのどちらにも該当しないので immediate value ではなくもちろん関数でもないから条件を満たさずエラーになる
>>217でやったように phoenix の val, ref でラップすれば function, f のほうで条件を満たすことができるのでエラーにはならない
ということだと思う
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.016s