Э-э, похоже, я не могу редактировать или комментировать, поэтому мне придется опубликовать это как ответ.
Я обошел проблему, разделив правило на правило оператора if и условие ifеще правило утверждения.Однако проблема снова в моем определении объявления init.
init_decl
%= identifier
>> -('=' >> expression)
;
identifier
%= lexeme[(alpha | char_('<em>'))
>> *(alnum | char</em>('_'))]
;
expression
%= literal
;
literal
%= real_literal
| string_literal
;
real_literal
%= double_
;
string_literal
%= lexeme['"'
>> *(char_ - '"')
>> '"']
;
Та же проблема, что и раньше.Тем не менее, я не сделал хорошую работу по исследованию проблемы в первый раз вообще.
In member function 'void boost::variant::convert_construct(T&, int, mpl_::false_) [with T = const Lang::Elements::Expression, T0_ = double, T1 = std::basic_string, std::allocator >, T2 = boost::detail::variant::void_, T3 = boost::detail::variant::void_, T4 = boost::detail::variant::void_, T5 = boost::detail::variant::void_, T6 = boost::detail::variant::void_, T7 = boost::detail::vari
Вот этот метод:
template <typename T></p>
<pre><code>void convert_construct(
T& operand
, int
, mpl::false_ = mpl::false_() // is_foreign_variant
)
{
// NOTE TO USER :
// Compile error here indicates that the given type is not
// unambiguously convertible to one of the variant's types
// (or that no conversion exists).
//
indicate_which(
initializer::initialize(
storage_.address()
, operand
)
);
}
Помните, что эта ошибка происходит от% = в выражении init_decl.Единственным вариантом в этом выражении является тот, который содержится в объекте Expression, который является значением атрибута правила выражения.Кажется, ошибка говорит о том, что вариант (тип объекта Expression содержит) пытается создать экземпляр себя из Expression, но я не вижу этого нигде в коде.Как бы то ни было, я добавил операторы приведения к структуре Expression, которая предоставляет базовый вариант, но все равно получил ошибку.
Метод, который вызывает метод выше, таков:*
Кажется, что вместо этого он пытается вызвать этот метод:
template
void convert_construct(
Variant& operand
, long
, mpl::true_// is_foreign_variant
)
{
convert_copy_into visitor(storage_.address());
indicate_which(
operand.internal_apply_visitor(visitor)
);
}</code>
</code>
Это недоразумение компилятора, которое является причиной этой ошибки?