2011-04-20 96 views
3

以下代码:为什么我不能使用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' 

我原来用一个很简单的一个刚试过,但我想,以满足对BoundedTypes 要求Boost.Variant地方。一个曾经是

struct A {}; 

访客正常工作与字符串值,但甚至不能编译走亲访友A.我用gcc-4.4.5。有任何想法吗?

回答

4
message_t a(A()); 

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

+0

AH !!!是的,我在Meyers的Effective *书中看到过这种情况。谢谢。 – 2011-04-21 15:56:20

+0

这个解析问题是否与boost :: variant具有其有界类型的模板化转换构造函数有关? – 2011-04-21 16:46:12

+0

@Ken:不 - 与'boost :: variant'完全无关。对于任何类型的T和U,形式为'T a(U());'的语句将被视为一个称为“a”的函数的声明,返回一个“T” U'参数。 – 2011-04-22 01:16:19

相关问题