在C ++中继承类时出错:模板参数推导/替换失败

时间:2013-08-27 10:08:18

标签: c++ inheritance compiler-errors

我是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 个答案:

答案 0 :(得分: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--也是如此。

只需查看this操作员重载即可。

答案 1 :(得分:0)

note:开头的g ++错误消息只是提供有关先前错误发生原因的更多信息。使用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<<

答案 2 :(得分:0)

以下行意味着您向stdout追加void并且不支持。

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

所以编译器抱怨如下。

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

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

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

答案 3 :(得分:0)

你应该把std :: ostream&amp;将参数转换为显示功能:

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

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