Внутренний вызов внутри объекта функции, (специфично для Boost::apply_visitor)

В настоящее время я пишу оценщик выражений набора, который генерирует set и 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);

Надеюсь, что это поможет другим!

Другие вопросы по тегам