2009-02-09 3 views
3

성령 문법에 대한 반복 구문 분석을 사용하려고하면 반복자 유형에서 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 char*const boost::spirit::file_iterator<char_t, boost::spirit::fileiter_impl::mmap_file_iterator<char_t> >을 변환 할 수 없습니다 여기

답변

3

몇 가지 기본 오류가 있기 때문에 게시 된 코드와 구분하기가 어렵습니다. 다음의 보정 후, 내 컴퓨터에 (7.1 ++ MSVC와) 잘 컴파일 :

#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; 
} 
+0

글쎄요, 유용한 정보입니다. 컴파일러 버전 문제 일 것 같아요. –

0

를 전달하는 하나의 방법 *의 포인팅 숯불을 얻는 것입니다 반복자와 같은 요소에 :이 비록 컴파일 할 수 있었는지

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

잘 모르겠어요 :

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

코드에서 지적한 버그가 수정되었습니다. 또한 C 스타일 문자열로 변환 할 수 없습니다. –

0

컴파일 에러가 제공되는 샘플에 없었다. 위의 문법에서 의미 론적 행동은 없지만 코드에서 나는 단순화했다.

이러한 작업에 대한 콜백은 내가 사용했던 반복기 유형 대신 char *를 사용했습니다.

0

의미 론적 동작이 인수 유형에 다형성이 있는지 확인할 수 있습니다. 정확하게 코드에서이 같은 것을 원하는 것 :

real_p[my_action()] 

을 아니면 바이너리 의미 조치를 필요한 경우 ':이 같은 단항 의미 조치를 사용하십시오

struct my_action { 
    template <class ParamType> 
    void operator()(ParamType const & parameter) const { 
    // deal with parameter 
    } 
}; 

는 아래 그림과 같이 d :

struct binary_action { 
    template <class ParamType> 
    void operator()(ParamType const & param1, ParamType const & param2) const { 
    // deal with either parameter 
    } 
}; 

(*char_p)[binary_action()]