我試圖在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 ®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,但是這對於一個操作來說太昂貴了。
cmatch似乎已經解決了我的問題!標記爲答案在一分鐘左右... – ffhighwind
_Ptr是有點iffy。我不確定它是一個特定於Visual Studio的內部表示還是僅僅是一個lexertl事物。我相信所有迭代器在VS中都有_Ptr。 – ffhighwind
@ffhighwind如果這是一個迭代器,那麼它絕對是一個實現細節。標準庫中帶有下劃線後跟大寫字母的任何內容都不適合公共使用。您應該能夠通過使用'&(* curr.results.start)' – Praetorian