Общий случай: я не могу понять, почему мои грамматические/семантические действия Духа не компилируются.
Иногда компилятор будет жаловаться на несовместимость присвоений или типов, и я не знаю, что неправильно. Проблема возникает в двух основных областях:
- прогнозирование типа синтезированных атрибутов для правила/выражения
- следовательно, прогнозирование того, какие типы атрибутов могут быть юридически определены как открытый атрибут для правила (полагаясь на построение конверсий, адаптеров слияния или точек настройки Духа).
- сопоставление типов аргументов для моего семантического действия, чтобы
- компилятор сможет скомпилировать вызов функции
- вызов не будет вызывать ненужные неявные преобразования в процессе
Ошибка компилятора не совсем выполнима, и либо документация неверна, либо я неправильно ее понял.
Есть ли способ узнать, что именно передает Дух в мое семантическое действие?
Пример кода:
struct mybase { int a,b; };
struct myderived : mybase { int c,d; };
BOOST_FUSION_ADAPT_STRUCT(mybase, (int,a)(int,b));
BOOST_FUSION_ADAPT_STRUCT(myderived, (int,a)(int,b)(int,c)(int,d));
auto base_expr = int_ >> int_; // avoids assigning to struct attribute
rule<decltype(f), mybase() , space_type> base_ = int_ >> int_;
rule<decltype(f), myderived(), space_type> derived_ = base_ >> int_ >> int_;
myderived data;
bool ok = phrase_parse(f,l,derived_,space,data);
Этот код не будет компилироваться с огромным количеством непроницаемых ошибок.
(свободно адаптированный из публикации в дух-общий список)