问题是我希望使用
输出我的程序Ackermann<M,N>::wartosc;
我想通过重载运算符&lt;&lt;来实现它,但是当我在main中我可以输入
cout << Ackermann<M,N>::wartosc;
也存在问题。
这是我的代码
#include <iostream>
using namespace std;
template<int M, int N>
class Ackermann {
private:
int n0, m0;
int count(int m, int n)
{
if ( m == 0 ) return n+1;
else if ( m > 0 && n == 0 ){ return count(m-1,1);}
else if ( m > 0 && n > 0 ) { return count(m-1,count(m,n-1));}
return -1;
}
public:
Ackermann()
{
n0 = N;
m0 = M;
}
int wartosc()
{
return count(m0,n0);
}
template<int M1, int N1>
friend ostream & operator<< (ostream &wyjscie, const Ackermann<M1,N1> &s);
};
template<int M, int N>
ostream & operator<< (ostream &output, const Ackermann<M,N> &s)
{
return output << Ackermann<M,N>::wartosc;
}
int main()
{
Ackermann<3, 3> function;
cout << function << endl;
return 0;
}
,错误是
ack.cpp:38:36: error: invalid use of non-static member function ‘int Ackermann<M, N>::wartosc() [with int M = 3, int N = 3]’
答案 0 :(得分:2)
您需要调用实例s
上的成员函数:
return output << s.wartosc();
// ^^
接下来,由于您要传递const
引用,因此需要制作count
和wartosc
方法const
:
int count(int m, int n) const { ....
int wartosc() const { ...
答案 1 :(得分:1)
看起来你的问题就在这里:Ackermann<M,N>::wartosc
您将其视为静态方法。而是将其更改为使用传入的s
参数。
template<int M, int N>
ostream & operator<< (ostream &output, const Ackermann<M,N> &s)
{
return output << s.wartosc;
}
答案 2 :(得分:1)
你需要调用成员函数AND最好在实例上...
return output << s.wartosc();
答案 3 :(得分:1)
我发现clang ++错误信息更容易理解:
ack.cpp:37:38: error: call to non-static member function without an object
argument
return output << Ackermann<M,N>::wartosc;
~~~~~~~~~~~~~~~~^~~~~~~
你正在调用wartosc,就像它是一个静态函数,但事实并非如此。替换为:
return output << s.wartosc;