2014-06-17 3 views
0

Visual Studio Ultimate 2012에서 다음 코드를 컴파일하려고합니다. 오류가 발생하여 해당 함수에 대해 존재하지 않는 오버로드를 호출하고 있습니다. regex_search() 템플릿. std :: regex_search()가 내 인수를 허용하지 않습니다.

#include <regex> 

struct Token 
{ 
    //lexertl token wrapper... 
}; 

class Lexer 
{ 
    //... 
    Token &curr; 
    bool skipUntil(const std::regex &regexp); 
}; 

bool Lexer::skipUntil(const std::regex &regexp) 
{ 
    std::smatch m; 
    const char *str = curr.results.start._Ptr; //compiles 
    //ERROR ON NEXT LINE (overload doesn't exist, but it should...) 
    if(std::regex_search(str, regexp, m)) { 
     curr.results.start = m[0].first; 
     curr.results.end = curr.results.start; 
    } 
} 

//from <regex> 
template <class charT, class Alloc, class traits> 
    bool regex_search (const charT* s, match_results<const charT*, Alloc>& m, 
    const basic_regex<charT,traits>& rgx, 
    regex_constants::match_flag_type flags = regex_constants::match_default); 

내가 쉽게 수정 그냥 const를 문자로 변환하는 것입니다 알고 ... 나는 지금까지 내가 말할 수있는 존재하는, 사용하기 위해 노력하고있어 템플릿입니다 * std :: string으로 변환 할 수 있지만 너무 비싸서 조작 할 필요가 없습니다.

답변

3

regex_search에 대한 인수가 잘못된 순서로 전달되고 있습니다. 두 번째 인수는 std::match_results이고 세 번째 인수는 std::basic_regex이어야합니다.

또한 regex_search의 첫 번째 인수가 std::string 일 때 std::smatch 또는 std::match_results<std::string::const_iterator>이 사용됩니다. char const *을 전달하기 때문에 std::cmatch (또는 std::match_results<const char*>)을 사용해야합니다. 다음 코드가 컴파일됩니다.

char const *str = ""; 
std::cmatch m; 
std::regex regexp; 
std::regex_search(str, m, regexp); 


const char *str = curr.results.start._Ptr; 

라인 위의 매우 의심스러운. curr.results.start이 C++ 표준 라이브러리의 일부 유형 인 경우 해당 _Ptr 구성원에 액세스하면 안되며 구현 세부 사항으로 간주됩니다. 이 코드를 사용하면 코드를 이식 할 수 없게됩니다. VS2013으로 업그레이드하면 고장날 수도 있습니다.

+0

cmatch가 내 문제를 해결 한 것 같습니다! 잠시 후 대답으로 표시하거나 ... – ffhighwind

+0

_Ptr은 약간의 iffy입니다. 그것은 Visual Studio 또는 lexertl에만 국한된 표현인지 확실하지 않습니다. 나는 모든 반복기가 VS에 _Ptr을 가지고 있다고 믿는다. – ffhighwind

+0

@ffhighwind iterator 인 경우 명확하게 구현 세부 사항입니다. 선행 밑줄 뒤에 대문자가 오는 표준 라이브러리의 내용은 일반인을 대상으로하지 않습니다. '& (* curr.results.start) '를 사용하여 기본 포인터에 액세스 할 수 있어야합니다. – Praetorian

관련 문제