std :: regex_search()不接受我的论点

时间:2014-06-17 04:40:19

标签: c++ visual-c++ visual-studio-2012 c++11

我正在尝试在Visual Studio Ultimate 2012中编译以下代码。它给我一个错误,说我正在调用模板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 char *转换为std :: string,但是要考虑的操作太贵了。

1 个答案:

答案 0 :(得分:3)

regex_search的参数以错误的顺序传递。第二个参数应为std::match_results,第三个参数应为std::basic_regex

此外,当std::smatch的第一个参数为std::match_results<std::string::const_iterator>时,会使用regex_searchstd::string。由于您要传递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时甚至可能会中断。