c++ - 为什么我不能用 boost::variant 访问这个自定义类型?

标签 c++ visitor-pattern boost-variant

以下代码:

#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 的所有 要求。曾经是

struct A {};

访问者可以很好地处理字符串值,但甚至无法编译访问 A 的尝试。我使用的是 gcc-4.4.5。有什么想法吗?

最佳答案

message_t a(A());

有最令人烦恼的解析问题:声明一个函数而不是创建一个变量。许多方法可以解决,例如message_t a = A();

关于c++ - 为什么我不能用 boost::variant 访问这个自定义类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5737826/

相关文章:

c++ - 抗锯齿问题

java - JSqlParser 如何拆分一个表达式

c++ - 带有 boost 变体的递归 using 声明

具有多态性的 C# Func<Interface>

c++ - 访客 : adding more types via inheritance

c++ - 如何获得指向 boost::variant 存储的指针?

c++ - boost::variant 访问者返回错误(最烦人的解析?)

c++ - 从 Windows 中的 waf 构建 Qt 程序中删除控制台

c++ - 在 C++ 中从管道获取 Gnuplot 版本

c++ - 使用 updatePaintNode : new frame only appears when I resize screen 在 QT/OpenGL 中渲染视频