【发布时间】:2017-12-14 11:59:44
【问题描述】:
我在当前运算符中获得了一个关于apply_visitor 的编译器。
我在该方法之外测试了所有apply_visitor,它工作得非常好。就在尝试在该方法中使用它时,它会遇到一堆问题。
错误信息让我很困惑。
那么,为什么尝试将apply_visitor 用于其他访问者会在当前访问者中遇到问题?
这里是给我错误的代码片段:
typedef boost::make_recursive_variant<string, int, vector<boost::recursive_variant_ > >::type ObjectE;
class ReturnType : public boost::static_visitor<string> {
public:
string operator()(string &s) { return "string"; }
string operator()(int i) {return "int";}
string operator()(std::vector<ObjectE> const &v) {return "vector";}
};
class ReturnVal : public boost::static_visitor<string> {
public:
string operator()(string &s) { return s; }
string operator()(int i) {return to_string(i);}
string operator()(std::vector<ObjectE> const &v) {return "vector";}
};
class ReturnV : public boost::static_visitor<vector<ObjectE>> {
public:
vector<ObjectE> operator()(string &s){ return {};}
vector<ObjectE> operator()(int i) {return {};}
vector<ObjectE> operator()(vector<ObjectE> const &v) {return v;}
};
struct create_Str {
using result_type = void;
std::ostream & out;
template <typename T> void call(T const &v) { return operator()(v);}
template <typename... Ts> void operator()(boost::variant<Ts...> const &v) {
return boost::apply_visitor(*this, v);
}
void operator()(int i) { out << i; }
void operator()(std::string const &s) { out << s; }
template <typename... Ts> void operator()(std::vector<Ts...> const &v) {
string name = boost::apply_visitor(ReturnVal(), v[0]);
if (v.size() == 3 && isOp(name)) {
}
else if (v.size() == 3 && isListCons(name)) {
call(v[1]);
ObjectE tail = v[2];
for (;;) {
if ("[]" == boost::get<string>(tail) || "nil" == boost::get<string>(tail)) {
break;
}
if ( !(boost::apply_visitor(ReturnType(), tail) == "vector")) {
}
vector<ObjectE> list = boost::apply_visitor(ReturnV(), v[2]);;
if (!(list.size() == 3 && isListCons(boost::apply_visitor(ReturnVal(), list[0])))) {
}
}
}
}
};
一开始我觉得可能
vector<ObjectE> list = v[2];
是问题所在。所以我创建了一个返回向量的访问者。
但是,似乎大多数错误是:
error: no match for call to '(const ReturnVal) (std::__cxx11::basic_string<char>&)'
我不确定这是什么意思。
谁能给我解释一下是什么问题?
【问题讨论】:
-
请提供minimal reproducible example。这意味着删除不会阻止编译错误的每一行和表达式。但包括构建错误所需的每一行。我们应该可以复制粘贴发布的代码来解决错误,并且应该比您上面发布的代码少。
-
您的代码不完整;特别是,它似乎缺少一个
main()函数和至少一个#include。请edit您的代码,这是您的问题的minimal reproducible example,然后我们可以尝试重现并解决它。您还应该阅读How to Ask。
标签: c++ boost boost-variant