【问题标题】:std::regex_search() isn't accepting my argumentsstd::regex_search() 不接受我的论点
【发布时间】:2014-08-06 23:53:02
【问题描述】:

我正在尝试在 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,但考虑到这样的操作成本太高。

【问题讨论】:

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


    【解决方案1】:

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

    此外,当regex_search 的第一个参数是std::string 时,使用std::smatchstd::match_results&lt;std::string::const_iterator&gt;。由于您传递的是char const *,因此您必须使用std::cmatch(或std::match_results&lt;const char*&gt;)。以下代码编译。

    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 时,它甚至可能会中断。

    【讨论】:

    • _Ptr 有点不确定。我不确定它是特定于 Visual Studio 的内部表示还是只是 lexertl 的东西。我相信所有迭代器在 VS 中都有 _Ptr。
    • @ffhighwind 如果这是一个迭代器,那么它绝对是一个实现细节。标准库中带有前导下划线后跟大写字母的任何内容都不适合公共使用。您应该能够使用&amp;(*curr.results.start) 访问底层指针
    • 我最终使用了 regex_search(curr.results.start, curr.results.eoi, ...) 的迭代器版本来绕过指针/迭代器转换。我可能很遗憾地放弃了整个项目并打算使用 ANTLR,因为它更易于维护。我很犹豫,但他们正在开发 v4 的 C++ 版本,我可以稍后迁移到。
    猜你喜欢
    • 2011-03-08
    • 2019-03-08
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2021-08-04
    相关资源
    最近更新 更多