C ++重载<< (无效使用非静态成员)

时间:2013-11-19 14:02:37

标签: c++ overloading

问题是我希望使用

输出我的程序
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]’

4 个答案:

答案 0 :(得分:2)

您需要调用实例s上的成员函数:

return output << s.wartosc();
//                        ^^

接下来,由于您要传递const引用,因此需要制作countwartosc方法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;