当我尝试使用解析器形式解析Spirit语法时,我得到一个参数,将迭代器类型的转换错误传递给const char *。我该如何解决这个问题?
有一些限制。我在大输入上使用迭代器适配器,因此转换为C样式字符串是不可行的。
以下是演示此问题的示例代码:
#include <boost/spirit/core.hpp>
#include <boost/spirit/iterator/file_iterator.hpp>
#include <vector>
#include <string>
using std;
using boost::spirit;
struct ex : public grammar<route_grammar> {
template <typename ScannerT> struct defintion {
definition(ex const& self) {
expression = real_p;
}
rule<ScannerT> expression;
rule<ScannerT> const& start() const { return expression; }
};
int main() {
file_iterator<char> first;
file_iterator<char> last = first.make_end();
ex ex_p;
parse_info<file_iterator<char> > info = parse(first, last, ex_p, space_p);
return 0;
}
此代码中断:错误:在传递参数时无法将const boost::spirit::file_iterator<char_t, boost::spirit::fileiter_impl::mmap_file_iterator<char_t> >
转换为const char*
答案 0 :(得分:3)
很难从代码中看出已发布,因为它包含一些基本错误。 在纠正这些之后,它在我的机器上编译得很好(使用MSVC ++ 7.1):
#include <boost/spirit/core.hpp>
#include <vector>
#include <string>
using namespace std;
using namespace boost::spirit;
struct ex : public grammar<ex> {
template <typename ScannerT>
struct definition {
definition(ex const& self)
{
expression = real_p;
}
rule<ScannerT> expression;
rule<ScannerT> const& start() const { return expression; }
};
};
int main() {
vector<char> v;
v.push_back('3'); v.push_back('.'); v.push_back('2');
ex ex_p;
parse_info<vector<char>::iterator> info = parse(v.begin(), v.end(), ex_p, space_p);
return 0;
}
答案 1 :(得分:0)
这是让char *指向与迭代器相同的元素的一种方法:
&v.front() // v.begin()
&v.back() + 1 // v.end()
我不确定你是如何编译的:
vector<char> v;
v.push_back("3.2");
答案 2 :(得分:0)
编译错误不在提供的示例中。在上面的语法中我没有语义动作,而在代码中我简化了我的行为。
这些操作的回调使用char *而不是我正在使用的迭代器类型。
答案 3 :(得分:0)
您可以尝试确保您的语义操作在参数类型上是多态的。准确地在代码中你需要这样的东西:
struct my_action {
template <class ParamType>
void operator()(ParamType const & parameter) const {
// deal with parameter
}
};
您将使用如下所示的一元语义操作:
real_p[my_action()]
或者,如果您需要二进制语义操作,您可以执行以下操作:
struct binary_action {
template <class ParamType>
void operator()(ParamType const & param1, ParamType const & param2) const {
// deal with either parameter
}
};
(*char_p)[binary_action()]