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。有任何想法吗?
AH !!!是的,我在Meyers的Effective *书中看到过这种情况。谢谢。 – 2011-04-21 15:56:20
这个解析问题是否与boost :: variant具有其有界类型的模板化转换构造函数有关? – 2011-04-21 16:46:12
@Ken:不 - 与'boost :: variant'完全无关。对于任何类型的T和U,形式为'T a(U());'的语句将被视为一个称为“a”的函数的声明,返回一个“T” U'参数。 – 2011-04-22 01:16:19