gpt4 book ai didi

c++ - 重载数组的输出运算符

转载 作者:可可西里 更新时间:2023-11-01 16:38:08 25 4
gpt4 key购买 nike

根据 this answer , 重载输出运算符的正确方法 <<对于 C 风格的数组是这样的 -:

#include <iostream>
using namespace std;

template <size_t arrSize>
std::ostream& operator<<( std::ostream& out, const char( &arr )[arrSize] )
{
return out << static_cast<const char*>( arr ); // use the original version
}

// Print an array
template<typename T1, size_t arrSize>
std::ostream& operator <<( std::ostream& out, const T1( & arr )[arrSize] )
{
out << "[";
if ( arrSize )
{
const char* separator = "";
for ( const auto& element : arr )
{
out << separator;
out << element;
separator = ", ";
}
}
out << "]";
return out;
}

int main()
{
int arr[] = {1, 2, 3};
cout << arr;
}

但我仍然遇到编译错误

error: ambiguous overload for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'const char [2]')  

对于 out << "[";out << "]";声明。

这样做的正确方法是什么?

最佳答案

问题是 operator<< 的标准过载打印字符数组的是这个:

template< class CharT, class Traits >
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
const char* s );

所以当你提供你的时:

template <size_t arrSize>
std::ostream& operator<<( std::ostream& out, const char( &arr )[arrSize] )

这将是模棱两可的:我们有两个不同的函数模板,它们具有相同的转换序列,其中没有一个比另一个更专业。

但是,由于您希望您的版本仅调用原始版本,因此根本没有理由提供您的版本。只是让你的“通用”阵列打印机不接受char使用 SFINAE:

// Print an array
template<typename T1, size_t arrSize,
typename = std::enable_if_t<!std::is_same<T1,char>::value>>
std::ostream& operator <<( std::ostream& out, const T1( & arr )[arrSize] )
{ /* rest as before */ }

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

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