为啥我不能用 boost::variant 访问这个自定义类型?

Posted

技术标签:

【中文标题】为啥我不能用 boost::variant 访问这个自定义类型?【英文标题】:Why can't I visit this custom type with boost::variant?为什么我不能用 boost::variant 访问这个自定义类型? 【发布时间】:2011-04-20 23:33:18 【问题描述】:

以下代码:

#include <boost/variant.hpp>
#include <iostream>
#include <string>

struct A

    A()
    
    
    ~A() throw()
    
    
    A& operator=(A const & rhs)
    
        return *this;
    

    bool operator==(A const & rhs)
    
        return true;
    

    bool operator<(A const & rhs)
    
        return false;
    
;

std::ostream & operator<<(std::ostream & os, A const & rhs)

    os << "A";
    return os;


typedef boost::variant<int, std::string, A> message_t;

struct dispatcher_t : boost::static_visitor<>

    template <typename T>
    void operator()(T const & t) const
    
        std::cout << t << std::endl;
    
;

int main(int argc, char * const * argv)

    message_t m("hi");
    boost::apply_visitor(dispatcher_t(), m);
    message_t a(A());
    boost::apply_visitor(dispatcher_t(), a);

产生以下错误。

In file included from /usr/include/boost/variant/apply_visitor.hpp:17,
                 from /usr/include/boost/variant.hpp:24,
                 from main.cpp:2:
/usr/include/boost/variant/detail/apply_visitor_unary.hpp: In function ‘typename Visitor::result_type boost::apply_visitor(const Visitor&, Visitable&) [with Visitor = dispatcher_t, Visitable = message_t(A (*)())]’:
main.cpp:51:   instantiated from here
/usr/include/boost/variant/detail/apply_visitor_unary.hpp:72: error: request for member ‘apply_visitor’ in ‘visitable’, which is of non-class type ‘message_t(A (*)())’
/usr/include/boost/variant/detail/apply_visitor_unary.hpp:72: error: return-statement with a value, in function returning 'void'

我最初只是尝试使用一个非常简单的 A,但我试图满足 Boost.Variant 放置在 BoundedTypes 上的每个要求。 A曾经是

struct A ;

访问者使用字符串值可以正常工作,但甚至无法编译访问 A 的尝试。我使用的是 gcc-4.4.5。有什么想法吗?

【问题讨论】:

【参考方案1】:
message_t a(A());

有一个最棘手的解析问题:声明一个函数而不是创建一个变量。解决方法很多,例如message_t a = A();

【讨论】:

这个解析问题是否与 boost::variant 的有界类型有一个模板化的转换构造函数有关? @Ken:不——它与boost::variant 一点关系都没有。对于 any 类型 TUT a(U()); 形式的语句将被视为名为 a 的函数的声明,返回 T,采用 U参数。 粗糙。感谢您的澄清。

以上是关于为啥我不能用 boost::variant 访问这个自定义类型?的主要内容,如果未能解决你的问题,请参考以下文章

用 boost::variant 元素填充的 std::set 不能按后代排序?

Boost::Variant 和其中的 function_types:如何将函数放入 Boost::variant?

boost.variant 派生类型:不能使用复制构造函数

为递归变体编写 boost::variant 访问者

Boost::Variant "Error: no match for call to [...]" 访问者操作符重载

boost::variant gettor-visitor: 保存返回的引用