这是一个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)
}
答案 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&);
// ^^^^^