Hôm nay tôi nghĩ rằng nó sẽ là một ý tưởng tốt đẹp để quá tải operator<<
cho mảng C phong cách:điều hành quá tải << cho mảng
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';
}
Thật vậy, đây in {2, 3, 5, 7, 11, 13, 17, 19}
độc đáo. Tuy nhiên, bằng cách cung cấp tình trạng quá tải đó, tôi không thể in các chuỗi chữ nữa:
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'
Điều này thực sự khó hiểu. Tại sao trình biên dịch thậm chí còn xem xét quá tải long int
khi không có chuyển đổi từ const char[13]
thành long int
ngay từ đầu?
Các biến thể của thông báo lỗi này xuất hiện cho long unsigned int
, short int
, short unsigned int
, int
, unsigned int
, long long int
và long long unsigned int
.
(ứng cử viên khác là const void*
, const char*
và const _CharT*
, và mẫu của riêng tôi.)
tôi giải quyết vấn đề bằng cách cung cấp các khuôn mẫu để chỉ các loại phi char:
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])
Nhưng Tôi vẫn còn bối rối bởi câu hỏi tại sao trình biên dịch coi các kiểu số như ứng cử viên.
'std :: ostream' là tham chiếu đến một lớp học. – Mankarse