В настоящее время я пишу оценщик выражений набора, который генерирует набор и набор >, код ниже должен отобразить результат выражения.
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;
}
};
Проблема IЯ испытываю происходящее, когда пытаюсь оценить наборы наборов, используя код набора, очевидно, я использую это, так как это хорошая практика, но компилятору не нравится синтаксис, который я использую для построения вызова.
output += boost::apply_visitor(string_visitor(), *it);
Есть две строки, подобные этим, они производят трассировку.
e: \ Documents \ level 3 \ Advanced Software Engineering \ Coursework \ coursework \ boost \ option \ 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 \ расширенная разработка программного обеспечения \ курсовая работа \ курсовая работа \ 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>]
Кто-нибудь знает, как сформулировать вызов такого рода?
Ура, Алекс