我正在尝试在Visual Studio Ultimate 2012中编译以下代码。它给我一个错误,说我正在调用模板regex_search()不存在的重载。
#include <regex>
struct Token
{
//lexertl token wrapper...
};
class Lexer
{
//...
Token &curr;
bool skipUntil(const std::regex ®exp);
};
bool Lexer::skipUntil(const std::regex ®exp)
{
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,但是要考虑的操作太贵了。
答案 0 :(得分:3)
regex_search
的参数以错误的顺序传递。第二个参数应为std::match_results
,第三个参数应为std::basic_regex
。
此外,当std::smatch
的第一个参数为std::match_results<std::string::const_iterator>
时,会使用regex_search
或std::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时甚至可能会中断。