boost::make_recursive_variant 没有名为 'apply_visitor' 的成员
boost::make_recursive_variant has no member named 'apply_visitor'
第一次使用 Boost,正在尝试了解如何使用 boost::variant
。请在下面找到示例程序和错误消息 (GCC v5.3.0, -std=c++14)
#include <vector>
#include <iostream>
#include <sstream>
#include <boost/variant.hpp>
using int_tree_t =
boost::make_recursive_variant <
int,
std::vector<boost::recursive_variant_>>;
auto operator << (std::ostream& out, const int_tree_t& tree) ->
std::ostream&
{
struct stringify :
public boost::static_visitor <std::string>
{
public:
auto operator () (int i) const ->
std::string
{
return std::to_string (i);
}
auto operator () (const std::vector<int_tree_t>& vec) const ->
std::string
{
std::stringstream ss;
ss << "(";
auto it = std::begin (vec);
if (!vec.empty ()) {
ss << *it;
}
for (; it != std::end (vec); ++it) {
ss << " " << *it;
}
ss << ")";
return ss.str ();
}
};
std::stringstream ss;
ss.flags (out.flags ());
ss << boost::apply_visitor (stringify (), tree);
return (out << ss.str ());
}
错误信息:
In file included from /usr/local/include/boost/variant/apply_visitor.hpp:16:0,
from /usr/local/include/boost/variant/detail/hash_variant.hpp:23,
from /usr/local/include/boost/variant/variant.hpp:34,
from /usr/local/include/boost/variant.hpp:17,
from test2.cpp:5:
/usr/local/include/boost/variant/detail/apply_visitor_unary.hpp: In instantiation of ‘typename Visitor::result_type boost::apply_visitor(const Visitor&, Visitable&) [with Visitor = operator<<(std::ostream&, const int_tree_t&)::stringify; Visitable = const boost::make_recursive_variant<int, std::vector<boost::recursive_variant_, std::allocator<boost::recursive_variant_> > >; typename Visitor::result_type = std::__cxx11::basic_string<char>]’:
test2.cpp:50:43: required from here
/usr/local/include/boost/variant/detail/apply_visitor_unary.hpp:84:43: error: ‘const struct boost::make_recursive_variant<int, std::vector<boost::recursive_variant_, std::allocator<boost::recursive_variant_> > >’ has no member named ‘apply_visitor’
return visitable.apply_visitor(visitor);
^
如果我理解正确,boost::make_recursive_variant
应该创建一个与 boost::variant
行为相同的类型...但是错误消息似乎表明它没有 apply_visitor
函数,这是访问所必需的。我已经阅读了 [this(http://www.boost.org/doc/libs/1_60_0/doc/html/variant/tutorial.html) 页面,但是没有关于必须使用具有递归变体的 "special" 访问模式的内容。
我应该如何编写这个程序?
make_recursive_variant
是一个元函数,它本身不是一个类型。所以你必须评估元函数:
using int_tree_t =
boost::make_recursive_variant <
int,
std::vector<boost::recursive_variant_>>::type;
↑↑↑↑↑↑
否则,您使用的是元函数类型而不是变体类型。
第一次使用 Boost,正在尝试了解如何使用 boost::variant
。请在下面找到示例程序和错误消息 (GCC v5.3.0, -std=c++14)
#include <vector>
#include <iostream>
#include <sstream>
#include <boost/variant.hpp>
using int_tree_t =
boost::make_recursive_variant <
int,
std::vector<boost::recursive_variant_>>;
auto operator << (std::ostream& out, const int_tree_t& tree) ->
std::ostream&
{
struct stringify :
public boost::static_visitor <std::string>
{
public:
auto operator () (int i) const ->
std::string
{
return std::to_string (i);
}
auto operator () (const std::vector<int_tree_t>& vec) const ->
std::string
{
std::stringstream ss;
ss << "(";
auto it = std::begin (vec);
if (!vec.empty ()) {
ss << *it;
}
for (; it != std::end (vec); ++it) {
ss << " " << *it;
}
ss << ")";
return ss.str ();
}
};
std::stringstream ss;
ss.flags (out.flags ());
ss << boost::apply_visitor (stringify (), tree);
return (out << ss.str ());
}
错误信息:
In file included from /usr/local/include/boost/variant/apply_visitor.hpp:16:0,
from /usr/local/include/boost/variant/detail/hash_variant.hpp:23,
from /usr/local/include/boost/variant/variant.hpp:34,
from /usr/local/include/boost/variant.hpp:17,
from test2.cpp:5:
/usr/local/include/boost/variant/detail/apply_visitor_unary.hpp: In instantiation of ‘typename Visitor::result_type boost::apply_visitor(const Visitor&, Visitable&) [with Visitor = operator<<(std::ostream&, const int_tree_t&)::stringify; Visitable = const boost::make_recursive_variant<int, std::vector<boost::recursive_variant_, std::allocator<boost::recursive_variant_> > >; typename Visitor::result_type = std::__cxx11::basic_string<char>]’:
test2.cpp:50:43: required from here
/usr/local/include/boost/variant/detail/apply_visitor_unary.hpp:84:43: error: ‘const struct boost::make_recursive_variant<int, std::vector<boost::recursive_variant_, std::allocator<boost::recursive_variant_> > >’ has no member named ‘apply_visitor’
return visitable.apply_visitor(visitor);
^
如果我理解正确,boost::make_recursive_variant
应该创建一个与 boost::variant
行为相同的类型...但是错误消息似乎表明它没有 apply_visitor
函数,这是访问所必需的。我已经阅读了 [this(http://www.boost.org/doc/libs/1_60_0/doc/html/variant/tutorial.html) 页面,但是没有关于必须使用具有递归变体的 "special" 访问模式的内容。
我应该如何编写这个程序?
make_recursive_variant
是一个元函数,它本身不是一个类型。所以你必须评估元函数:
using int_tree_t =
boost::make_recursive_variant <
int,
std::vector<boost::recursive_variant_>>::type;
↑↑↑↑↑↑
否则,您使用的是元函数类型而不是变体类型。