超载的调用是模棱两可的
Call of overloaded is ambigous
我正在做一个编译器项目。当我在 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*
重载。
- 调用重载的"<大括号括起来的初始值设定项列表>"对于对来说就足够了是模棱两可的
- 为什么对模板的调用不模棱两可?
- 模棱两可的调用 - 模板化函数
- C++ lambda 模棱两可的调用
- C++11 中对超载'ref(Select::Expressions::Code&)'的调用模棱两可
- 是可调用和模棱两可的调用:g++ 或 clang 中的错误
- 超载的调用是模棱两可的
- C 从同一基本模板类覆盖功能,具有多个继承模棱两可的函数调用
- MSVC发现这种方法调用模棱两可,而Clang / GCC则不然吗?
- 为模棱两可的超载功能调用创建默认值
- 重载函数的调用 - 以继承的类作为参数 - 是模棱两可的
- 为什么对函数的调用"sample_mean"模棱两可的?
- 对 glm::slerp 的模棱两可的调用
- 超载的调用是模棱两可的
- 对重载函数的模棱两可的调用,即使一个更专业
- 为什么 main() 中的调用 'A a(c);' 不模棱两可?
- Gtkmm,重载的'Scale()'的调用是模棱两可的
- 调用重载<大括号括起来的初始值设定项列表>是模棱两可的,如何处理?
- 调用超载to_string模棱两可
- 对函数的调用在C++中是模棱两可的.候选函数是原型和函数本身