使用重载的operator()C ++时出错

时间:2014-11-30 11:55:47

标签: c++ compiler-errors operator-overloading

这是一个C ++代码,很简单,但是我得到了一些我不理解的错误 我不知道如何使用重载operator (),但我的方式 计划应该做到以下几点。

  

输入您的字词:编程
  n:5
  P
  镨
  临
  PROG
  Progr

我得到错误:

  

与'operator<<'不匹配在'std :: cout<<字::运算符()(INT)(n)的'

Word.h

#ifndef WORD_H
#define WORD_H


class Word
            {
            private:
                    char *str;
            public:
                    Word();
                    ~Word();
                    Word operator()(int); //overloading operator ()
                    friend std::ostream& operator<<(std::ostream&,Word&);
                    friend std::istream& operator>>(std::istream&,Word&);
            };

#endif

Word.cpp

#include <iostream>
#include <cstring>
#include "Word.h"

Word::Word()
    {
    str=new char[100];
    }

Word::~Word()
    {
    delete[] str;
    }


Word Word::operator()(int d)  //overloading operator ()
    {
    Word pom;
    strncpy(pom.str,str,d);
    return pom;
    }


std::ostream& operator<<(std::ostream& out,Word& s)
    {    
    out<<s.str; return out;
    }


std::istream& operator>>(std::istream& in,Word& s)
    {
    in>>s.str; return in;
    }

的main.cpp

#include<iostream>
#include "Word.h"


int main()
{
   Word r;
   std::cout<<"Type your word: "; 
   std::cin>>r;

   int n;
   std::cout<<"n:"; 
   std::cin>>n;

   for (int i=1; i<=n; i++) std::cout << r(i) << std::endl; //error when using r(i)
}

2 个答案:

答案 0 :(得分:4)

问题是

的签名
std::ostream& operator<<(std::ostream& out,Word& s);

通过引用接受Word

Word operator()(int);

按值返回Word。在表达式

cout << r(i);

您最终尝试将临时值绑定到引用,这是语言禁止的。只有reference to const可以绑定到临时值。将您的operator<<签名(在声明和定义中)更改为:

std::ostream& operator<<(std::ostream& out, const Word& s);

它应该有效。这也是一个明智的选择,因为operator<<不应该更改Word参数。

答案 1 :(得分:2)

当你这样做时

cout << r(i);

编译器执行以下操作:

  • 创建Word
  • 类型的临时变量
  • 致电operator(int),并捕获其结果
  • 将结果存储在临时对象中
  • 将临时对象传递给operator <<

由于您无权访问临时对象,因此编译器不允许对其进行非常量访问。这就是你得到错误的原因:你试图将一个隐式常量的对象传递给一个带有非常量引用的参数。

要解决此问题,请将operator<<的签名更改为规范签名,即为const参数提取Word&引用:

friend std::ostream& operator<<(std::ostream&, const Word&);
//                                             ^^^^^