1

我是 C++ 的新手。

我写了一个非常简单的程序,如下所示

#include<iostream>

using namespace std;

class index
{
protected:
    int count;
public:
    index()
    {
        count=0;
    }
    index(int c)
    {
        count=c;
    }
    void display()
    {
        cout<<endl<<"count="<<count;
    }
    void operator ++()
    {
        count++;
    }
};

class index1:public index{
public:
    void operator --()
    {
        count--;
    }
};

int main()
{
    index1 i;
    i++;
    cout<<endl<<"i="<<i.display();
    i++;
    cout<<endl<<"i="<<i.display();
    i--;
    cout<<endl<<"i="<<i.display();
}

但是当我在 G++ 中编译这段代码时,我得到了这个:

In file included from /usr/include/c++/4.7/iostream:40:0,
                 from inheritance.cpp:1:
/usr/include/c++/4.7/ostream:480:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, char)
/usr/include/c++/4.7/ostream:480:5: note:   template argument deduction/substitution failed:
inheritance.cpp:40:30: note:   cannot convert ‘i.index1::<anonymous>.index::display()’ (type ‘void’) to type ‘char’

编辑 我改成它解决了这个问题cout<<endl<<"i="<<i.display();cout<<endl<<"i="; i.display();

但现在我得到

inheritance.cpp:39:3: error: no ‘operator++(int)’ declared for postfix ‘++’ [-fpermissive]

4

4 回答 4

2

您不能将void函数传递给iostream.

您的函数应该返回一个值或一个iostreamdisplay()自己写一些东西(就像它看起来那样)。您可以通过以下方式解决您的问题:

int main()
{
    index1 i;
    i++;
    cout<<endl<<"i=";
    i.display();
    i++;
    cout<<endl<<"i=";
    i.display();
    i--;
    cout<<endl<<"i=";
    i.display();
}

你的operator++重载也是错误的,它应该是:

index operator ++(int)    // Look at the return value
{
    count++;
    return *this;       // return
}

对于operator--.

只需查看操作符重载。

于 2013-08-27T10:17:09.423 回答
0

以 g++ 开头的错误消息note:只是提供有关先前错误发生原因的更多信息。使用 g++ 4.8,我得到(以及其他错误):

main.cpp:40:21: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘void’)
     cout<<endl<<"i="<<i.display();
                     ^

这很好地解释了这个问题。的类型i.display()void,所以你不能operator<<像那样传递它。

于 2013-08-27T10:17:20.147 回答
0

以下行意味着您将 void 附加到 stdout 并且不受支持。

cout<<endl<<"i="<<i.display();

所以编译器抱怨如下。

"cannot convert ‘i.index1::<anonymous>.index::display()’ (type ‘void’) to type ‘char’"

您可以对以下内容执行相同操作,

cout<<endl<<"i=";
i.display();
于 2013-08-27T10:18:31.077 回答
0

您应该将 std::ostream& 流参数放入显示函数中:

std::ostream& display(std::ostream& stream)
{
   stream << endl << "count=" << count;
   return stream;
}

然后您可以显示将对象写入标准输出或文件中。

于 2013-08-27T10:26:17.297 回答