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

В настоящее время я пишу оценщик выражений набора, который генерирует набор и набор >, код ниже должен отобразить результат выражения.

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>]

Кто-нибудь знает, как сформулировать вызов такого рода?

Ура, Алекс

1 Ответ

0 голосов
/ 14 декабря 2010

Удалось решить проблему, просто приведя переменную обратно к типу варианта, который я определил. так что в моем случае это было решено с помощью:

output += boost::apply_visitor(string_visitor(), (Context<T>::ExpressionTree::stackType) *it);

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

...