为模板 class 定义 numeric_limits max 函数
defining numeric_limits max function for template class
我在为模板 class 定义函数 max 时遇到问题。在这个 class 中,我们将数字保存为不是简单的整数,而是一些数字系统中的数字向量。通过定义 numeric_limits,我需要 return 表示基于已定义数字系统的最大数字。
当我尝试 return class 最大表示时,我遇到了很多错误,但它在 return 整数时有效。
我的模板class:
template<int n,typename b_type=unsigned int,typename l_type=unsigned long long,long_type base=bases(DEC)>
class NSizeN
{
public:
int a_size = 0;
vector <b_type> place_number_vector; // number stored in the vector
NSizeN(int a){ //constructor
do {
place_number_vector.push_back(a % base);
a /= base;
a_size ++;
} while(a != 0);
}
void output(ostream& out, NSizeN& y)
{
for(int i=a_size - 1;i >= 0;i--)
{
cout << (l_type)place_number_vector[i] << ":";
}
}
friend ostream &operator<<(ostream& out, NSizeN& y)
{
y.output(out, y);
return out << endl;
}
}
在 .h 文件的末尾我有这个:
namespace std{
template<int n,typename b_type,typename l_type,long_type base>
class numeric_limits < NSizeN< n, b_type, l_type, base> >{
public :
static NSizeN< n, b_type, l_type, base> max(){
NSizeN< n, b_type, l_type, base> c(base -1);
return c;
}
}
我已经用 const 和 constexpr 试过了,但它不起作用。我不知道如何摆脱这个错误:
error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to'std::basic_ostream<char>&&'
std::cout << std::numeric_limits<NSizeN<3> >::max() << endl;
error: initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = NSizeN<3>]'
operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
这就是我在 main 中尝试做的事情:
std::cout << std::numeric_limits<NSizeN<3> >::max() << endl;
这是我的作业,所以不要评判这样做的方式,因为这是我的老师选择,我希望我能相当全面地介绍我的问题。
您面临的问题是您尝试将 max()
函数返回的临时值绑定到输出运算符的非常量引用。
最简洁的解决方案是将输出运算符声明为:
friend ostream &operator<<(ostream& out, const NSizeN& y)
并且您的 output
功能与
void output(ostream& out) const
请注意,我还删除了 output
函数未使用的第二个参数。 const 引用可以绑定到左值和右值,因此它也适用于 max()
函数返回的临时值。
编辑
作为@n.m。指出,您也不使用实际传递给 operator <<
的流,而只使用 std::cout
。实现它的正确方法是简单地使用流(在您的情况下,只需在 output
函数中将 cout << ...
替换为 out << ...
。这将使 std::cerr << std::numeric_limits<NSizeN<3> >::max();
等语句按预期工作。
我在为模板 class 定义函数 max 时遇到问题。在这个 class 中,我们将数字保存为不是简单的整数,而是一些数字系统中的数字向量。通过定义 numeric_limits,我需要 return 表示基于已定义数字系统的最大数字。
当我尝试 return class 最大表示时,我遇到了很多错误,但它在 return 整数时有效。
我的模板class:
template<int n,typename b_type=unsigned int,typename l_type=unsigned long long,long_type base=bases(DEC)>
class NSizeN
{
public:
int a_size = 0;
vector <b_type> place_number_vector; // number stored in the vector
NSizeN(int a){ //constructor
do {
place_number_vector.push_back(a % base);
a /= base;
a_size ++;
} while(a != 0);
}
void output(ostream& out, NSizeN& y)
{
for(int i=a_size - 1;i >= 0;i--)
{
cout << (l_type)place_number_vector[i] << ":";
}
}
friend ostream &operator<<(ostream& out, NSizeN& y)
{
y.output(out, y);
return out << endl;
}
}
在 .h 文件的末尾我有这个:
namespace std{
template<int n,typename b_type,typename l_type,long_type base>
class numeric_limits < NSizeN< n, b_type, l_type, base> >{
public :
static NSizeN< n, b_type, l_type, base> max(){
NSizeN< n, b_type, l_type, base> c(base -1);
return c;
}
}
我已经用 const 和 constexpr 试过了,但它不起作用。我不知道如何摆脱这个错误:
error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to'std::basic_ostream<char>&&'
std::cout << std::numeric_limits<NSizeN<3> >::max() << endl;
error: initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = NSizeN<3>]'
operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
这就是我在 main 中尝试做的事情:
std::cout << std::numeric_limits<NSizeN<3> >::max() << endl;
这是我的作业,所以不要评判这样做的方式,因为这是我的老师选择,我希望我能相当全面地介绍我的问题。
您面临的问题是您尝试将 max()
函数返回的临时值绑定到输出运算符的非常量引用。
最简洁的解决方案是将输出运算符声明为:
friend ostream &operator<<(ostream& out, const NSizeN& y)
并且您的 output
功能与
void output(ostream& out) const
请注意,我还删除了 output
函数未使用的第二个参数。 const 引用可以绑定到左值和右值,因此它也适用于 max()
函数返回的临时值。
编辑
作为@n.m。指出,您也不使用实际传递给 operator <<
的流,而只使用 std::cout
。实现它的正确方法是简单地使用流(在您的情况下,只需在 output
函数中将 cout << ...
替换为 out << ...
。这将使 std::cerr << std::numeric_limits<NSizeN<3> >::max();
等语句按预期工作。