c++ - 尽管看起来更匹配,但未考虑过载

标签 c++ overloading overload-resolution

这被 gcc (live on godbolt) 都拒绝了和 clang :

#include <string>

namespace
{
    std::string
    to_string(char const (&str) [14])
    { return str; }
}

void f()
{
    using std::to_string;
    char const hello[14] = "Hello, World!";
    (void) to_string(hello);
}

编译器会考虑 std::to_string overloads 中的每一个并得出结论:

error: no matching function for call to 'to_string(const char [14])'

如果我删除 using std::to_string ,我的过载被考虑并调用。为什么?如何修复它(除了删除使用之外)?

最佳答案

using 声明的范围很重要。这是一个正确的声明,因此名称隐藏生效。在函数内部,全局范围版本不可见。您需要重新引入它:

using ::to_string;
using std::to_string;

关于c++ - 尽管看起来更匹配,但未考虑过载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58427809/

相关文章:

c++ - 在 C/C++ 中访问 c​​onst 变量的速度

c++ - 为什么打印一个函数名会返回一个值?

c++ - 重载多个运算符时出现“不匹配”错误

c++ - 右值参数无法在函数重载中解析

java - 为什么这不会重载?

c# - 带有 while (true) 的特殊重载决议

c++ - 如何为 C++ 创建 Visual Studio 调试器可视化器

c++ - for循环的两个代码有什么不同?

c++ - 对具有私有(private)可访问性的重载继承函数使用声明

c++ - 使用可变函数模板的奇怪重载决议