1

我目前正在写一个set expression evaluator,它生成set<T>和set<set<T>>,下面的代码是显示表达式的结果。

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\coursework\boost\variant\detail\apply_visitor_unary.hpp(76) : error C2039: 'apply_visitor' : is not a member of 'std::set<_Kty>' 1> with 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> with 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> ]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> with 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::字符串 1> ]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> with 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::字符串 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> with 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> e:\documents\level 3\advanced software engineering\coursework\coursework\context.h(90) : 在编译类模板成员函数'std::string Context::ExpressionTree::string_visitor::operator ()( std::set<_Kty>) const' 1> with 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> ]字符串 Context::ExpressionTree::string_visitor::operator ()(std::set<_Kty>) const' 1> with 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> ]字符串 Context::ExpressionTree::string_visitor::operator ()(std::set<_Kty>) const' 1> with 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> ]请参阅对类模板实例化 'Context::ExpressionTree::string_visitor' 的引用 1> with 1> [ 1> T=std::string 1> ]请参阅对类模板实例化 'Context::ExpressionTree::string_visitor' 的引用 1> with 1> [ 1> T=std::string 1> ]

有谁知道如何表达这种呼叫?

干杯,亚历克斯

4

1 回答 1

-1

通过简单地将变量类型转换回我定义的变体类型来解决问题。所以在我的情况下,它是通过以下方式解决的:

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

希望对其他人有所帮助!

于 2010-12-14T01:13:16.603 回答