テンプレート クラスの関数 max の定義に問題があります。このクラスでは、数値を単純な整数としてではなく、いくつかの数値システムの数値のベクトルとして保持しました。また、numeric_limits を定義すると、定義された数値システムに基づく最大数の表現を返す必要があります。
そして、最大表現でクラスを返そうとすると多くのエラーが発生しますが、整数を返すと機能します。
私のテンプレートクラス:
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)
そして、これは私がメインでやろうとしていることです:
std::cout << std::numeric_limits<NSizeN<3> >::max() << endl;
これは私の課題なので、これを行う方法を判断しないでください。これは私の教師の選択であり、問題をかなり包括的に提示したことを願っています.