gpt4 book ai didi

c++ - 为数组重载运算符<<

转载 作者:IT老高 更新时间:2023-10-28 23:21:23 24 4
gpt4 key购买 nike

今天我认为重载operator<< 是个好主意对于 C 样式数组:

template<typename T, size_t N>
std::ostream& operator<<(std::ostream& os, T(&a)[N])
{
os << '{' << a[0];
for (size_t i = 1; i < N; ++i)
{
os << ',' << ' ' << a[i];
}
os << '}';
return os;
}

int main()
{
int numbers[] = {2, 3, 5, 7, 11, 13, 17, 19};
std::cout << numbers << '\n';
}

确实,这会打印出 {2, 3, 5, 7, 11, 13, 17, 19}很好。但是,通过提供该重载,我无法再打印字符串文字了:

    std::cout << "hello world\n";

error: ambiguous overload for 'operator<<' in 'std::cout << "hello world\012"'
note: candidates are:

note: std::basic_ostream<_CharT, _Traits>::__ostream_type&
std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _
Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_
type = std::basic_ostream<char>] <near match>

note: no known conversion for argument 1 from 'const char [13]' to 'long int'

这真是令人费解。为什么编译器甚至会考虑 long int没有来自 const char[13] 的转换时过载至long int首先?

此错误消息的变体出现在 long unsigned int 中。 , short int , short unsigned int , int , unsigned int , long long intlong long unsigned int .

(其他候选人是 const void*const char*const _CharT* ,以及我自己的模板。)


我通过只为非字符类型提供模板解决了这个问题:

template<typename T, size_t N>
typename std::enable_if<
!std::is_same<typename std::remove_cv<T>::type, char>::value,
std::ostream&>::type operator<<(std::ostream& os, T(&a)[N])

但我仍然对为什么编译器将数字类型视为候选者的问题感到困惑。

最佳答案

重载决策的第一阶段是识别可行的函数,这些函数可以接受提供的参数数量(完全忽略类型)。 (参见例如 13.3.2 [over.match.viable])。

然后考虑任何需要的转换以确定哪个是唯一的最佳可行函数。

在这种情况下,没有这样独特的最佳人选(有两个同样优秀的候选人)。

错误消息可能只是告诉您两个模棱两可的情况。但我认为他们试图通过展示为什么所有其他可行的功能都丢失了来提供帮助。有时这很有用,当您不知道为什么没有考虑要调用的函数时。

但我同意大多数情况下这只是很多噪音,尤其是对于像 operator << 这样的函数。或 operator >> (甚至 operator [] )有很多重载。

关于c++ - 为数组重载运算符<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9052624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com