【问题标题】:Why is std::string range constructor giving me an error macro passed 2 arguments, but takes just 1? [closed]为什么 std::string 范围构造函数给我一个错误宏传递了 2 个参数,但只需要 1 个? [关闭]
【发布时间】:2021-07-23 19:40:51
【问题描述】:

我有 Boost 解析器使用的这两个迭代器:

std::string equationToParse = "some_text";
std::string::const_iterator iter = equationToParse.begin();
std::string::const_iterator end = equationToParse.end();

然后,如果解析器失败,我会使用它来打印它可以解析的点:

std::string rest(iter, end);
std::cout << "Stopped at: \" " << rest << "\"\n";

这在不同的机器上对我有用,但现在我无法在新机器上编译,因为这个错误:

error: macro "rest" passed 2 arguments, but takes just 1: std::string rest(iter, end);

可能是变量名有冲突?我想这可能是因为旧的 C++ 版本(我遇到这个问题的机器的 g++ 版本是 g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0)但是 C++ 参考表示 std::string 的范围构造运算符自 C++98 以来就存在,所以我不确定会发生什么。

有什么想法吗?谢谢

【问题讨论】:

标签: c++ string g++ stdstring


【解决方案1】:

您提供的代码 sn-p应该编译并成功运行 (Live Example)。

您遇到的错误是由于您的代码中存在其他问题。唯一可以肯定的是,在您的代码中某处定义了一个名为 rest 的宏,从您发布的错误消息中可以明显看出:

错误:ma​​cro "rest" 传递了 2 个参数,但只接受了 1 个参数:std::string rest(iter, end);

(强调我的)

这是您自己使用 #define rest 完成的,还是来自您正在使用的第 3 方库,我们不能说 - 因为您没有向我们提供足够的信息进行调试。

这应该很容易缓解,只需将变量从 rest 重命名为其他名称:

std::string foo(iter, end);

如果您能找到导致#define rest 的原因,并且在您的控制范围内对其进行重命名,则明智的做法是考虑将其重命名为与您的一般命名方案不同的约定以避免这个问题。大多数开发人员倾向于使用完整的 SHOUT_CASE 宏名称,以避免常规变量名称出现问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多