문제

스피릿 문법에 반복자 형태의 구문 분석을 사용하려고 할 때 반복자 유형에서 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* 논쟁에서 통과

도움이 되었습니까?

해결책

몇 가지 기본 오류가 포함되어 있기 때문에 게시 된대로 코드에서 알 수 없습니다. 이를 수정 한 후 내 컴퓨터에서 잘 컴파일합니다 (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;
}

다른 팁

다음은 반복자와 동일한 요소를 가리키는 방법 중 하나입니다.

&v.front() // v.begin()
&v.back() + 1 // v.end()

그래도 어떻게 컴파일 할 수 있는지 잘 모르겠습니다.

vector<char> v;
v.push_back("3.2");

제공된 샘플에 컴파일 오류가 없었습니다. 위의 문법에는 의미 론적 행동이 없지만 코드에서는 단순화하고있었습니다.

반복자 유형 I 대신에 사용 된 작업의 콜백은 사용 중입니다.

당신은 당신의 의미 론적 행동이 논증의 유형에 대해 다형성인지 확인할 수 있습니다. 정확히 코드로 다음과 같은 것을 원할 것입니다.

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()]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top