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
,则会考虑并调用我的重载。为什么?如何解决(除了使用删除)?
答案 0 :(得分:3)
使用声明的范围很重要。这是一个正确的声明,因此名称隐藏生效。在函数内部,全局作用域版本不可见。您需要重新引入它:
using ::to_string;
using std::to_string;
答案 1 :(得分:3)
此使用声明
using std::to_string;
将声明隐藏在全局名称空间中。因此,编译器看不到函数:: to_string。
所以你必须写
using std::to_string;
using ::to_string;
并使未命名的名称空间内联。
inline namespace
{
// ...
}