Внутренний вызов внутри объекта функции, (специфично для Boost::apply_visitor)
В настоящее время я пишу оценщик выражений набора, который генерирует set
class string_visitor : public boost::static_visitor<string>
{
public:
string operator()(bool value) const
{
return "{}";
}
string operator()(set<T> value) const
{
set<T>::const_iterator it = value.begin();
string output = "{";
if(!value.empty())
{
output += *it; // Return an empty set if necessary.
++it;
}
for(; it != value.end(); ++it)
{
output += " " + *it;
}
output += "}";
return output;
}
string operator()(set<set<T> > value) const
{
set<set<T> >::const_iterator it = value.begin();
string output = "{";
if(!value.empty())
{
output += boost::apply_visitor(string_visitor(), *it); // Return an empty set if necessary.
++it;
}
for(; it != value.end(); ++it)
{
output += " " + boost::apply_visitor(string_visitor(), *it);
}
output += "}";
return output;
}
};
Проблема, с которой я сталкиваюсь, возникает, когда я пытаюсь оценить наборы наборов, используя код набора, очевидно, я использую это, поскольку это хорошая практика, но компилятору не нравится синтаксис, который я использую для построения вызова.
output += boost::apply_visitor(string_visitor(), *it);
Есть две такие линии, они производят след.
e: \ Documents \ Level 3\ Advanced Software Engineering \ Курсовая работа \ Coursework\ Boost \ Вариант \ Detail\apply_visitor_unary.hpp(76): ошибка C2039: 'apply_visitor': не является членом 'std:: set<_Kty>' 1> с 1> [ 1> _Kty=std::string 1> ] 1> e:\ Documents\level 3\ Advanced Software Engineering\coursework\coursework\context.h(96): см. Ссылку на создание шаблона функции 'std:: basic_string<_Elem, _Traits, _Ax> boost:: apply_visitor:: ExpressionTree:: string_visitor, const std:: set<_Kty >> (const Visitor &, Visitable &) 'компилируется 1> с 1> [ 1> _Elem=char, 1> _Traits=std::char_traits, 1> _Ax=std::allocator, 1> T=std::string, 1> _Kty=std::string, 1> Visitor=Context::ExpressionTree::string_visitor, 1> Visitable=const std::set 1> ] 1> e:\ Documents\level 3\ Advanced Software Engineering\coursework\coursework\context.h(90): при компиляции функции-члена шаблона класса 'std:: string Context:: ExpressionTree:: string_visitor:: operator () (std:: set<_Kty>) const '1> с 1> [ 1> T=std::string, 1> _Kty=std::set 1> ] 1> e:\ Documents\level 3\ Advanced Software Engineering\coursework\coursework\context.cpp(337): см. ссылку на создание экземпляра шаблона класса 'Context::ExpressionTree::string_visitor', который компилируется 1 > с 1> [ 1> T=std::string 1> ]
Кто-нибудь знает, как сформулировать такой вызов?
Ура, Алекс
1 ответ
Удалось решить проблему, просто приведя переменную обратно к типу, который я определил. так что в моем случае это было решено с помощью:
output += boost::apply_visitor(string_visitor(), (Context<T>::ExpressionTree::stackType) *it);
Надеюсь, что это поможет другим!