超载的调用是模棱两可的

Call of overloaded is ambigous

本文关键字:模棱两可 调用 超载      更新时间:2023-10-16

我正在做一个编译器项目。当我在 GitHub 上查看一些代码时,我在编译源代码时遇到了问题。错误是:

call of overloaded ‘newast(<anonymous enum>, NULL, _ast*&, NULL)’ is ambiguous

并且相关的功能是_ast* newast(_action, char*, _ast*, _ast*)_ast* newast(_action, int, _ast*, _ast*)

我不知道为什么这里会有这样的模棱两可。并遵循.y文件中的相关代码。

| IDENTIFIER '(' ')' { $$ = newast(_call, $1, NULL, NULL); }
        | IDENTIFIER '(' expr ')' { $$ = newast(_call, $1, newast(_dummy, NULL, $3, NULL), NULL); }
        | IDENTIFIER '(' expr ',' expr ')' { $$ = newast(_call, $1, newast(_dummy, NULL, $3, $5), NULL); }
        | IDENTIFIER '(' expr ',' expr ',' expr ')' { $$ = newast(_call, $1, newast(_dummy, NULL, $3, $5), newast(_dummy, NULL, $7, NULL)); }

两个重载方法之间的唯一区别是 char* 和 int 参数。在提供的代码中,大多数方法都使用 NULL 作为第二个参数调用 newast((,这是不明确的。编译器可以将 NULL 隐式转换为 int 或 char*,因此不确定该怎么做。

你需要更明确。传递 NULL 以外的内容或将 NULL 显式转换为其中一种类型。例如:

newast(_action, (char*(NULL, ...

这是 C++03 中的已知问题。计算结果为零的常量表达式(如 0 (既是整数又是指针(更准确地说,是空指针常量(。由于 NULL 被定义为这样的表达式,因此它也充当整数和指针。

大多数情况下,NULL 定义为 0L,这意味着它不完全是一个 int,当您将其传递给需要 int 的函数时需要进行转换。当您将其传递给需要指针的函数时,也需要进行转换。

因此,如果您有一个重载函数,该函数接受int或指针,并使用 NULL 参数调用它,则两者都不是完全匹配的,因此两者都不能首选,并且调用不明确。

如果可以使用 C++11,则首选nullptr而不是 NULL,因为nullptr只是一个指针而不是整数。否则,请使用 static_cast<char*>(NULL) 。更好的是,使用 std::string .

要选择其他重载,请使用 0 。它完全匹配int,因此int重载将优先于char*重载。