如何修复重载操作数+
How to fix overloading operands +?
我有过载opearator+的问题。
这是我的代码:
class Odcinek : public Figura
{
public:
Odcinek(int ile,string imie,char znak): Figura(ile,imie,znak){}
friend Odcinek& operator+(int liczba);
virtual void wypisz() const;
};
Odcinek& operator+(int liczba);
{
Odcinek Od;
Od.ile = Od.ile+liczba;
Od.imie = imie;
Od.znak = znak;
return Od;
}
我希望这个工作:
Odcinek F3(5,"Odcinek drugi",'*');
F3+3;
|===编译:在Figura中调试(编译器:GNU GCC编译器)===|include\Figura.h|29|错误:"Odcinek&operator+(int)"必须具有类或枚举类型的参数|C: \Users\mkkar\Desktop\Programowanie obiektowe~kolokwium\Figura\main.cpp||在函数'int main()'中:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|错误:与"operator+"不匹配(操作数类型为"Odcinek"answers"int")|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bitss\stl_iterator.h|341|注意:候选者:模板std::reverse_iterator std::operator+(typename std::inverse_iterator::difference_type,const std::reverse_iterator&)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_iterator.h|341|注意:模板参数推导/替换失败:|include\Figura.h|29|错误:"Odcinek&operator+(int)"必须具有类或枚举类型的参数|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\src\Figura.cpp|67|错误:"Odcinek&operator+(int)"必须具有类或枚举类型的参数|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\src\Figura.cpp|68|错误:在"{"标记之前应为不合格id|C: \Users\mkkar\Desktop\Programowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:类型"const-std::reverse_iterator"answers"int"不匹配|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bitss\stl_iterator.h|1200|注意:候选者:模板std::move_iterator std::operator+(typename std::move_iterator::difference_type,const std::move_iterator&)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_iterator.h|1200|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:类型"const-std::move_iterator"answers"int"不匹配|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4929|注意:候选者:模板std::__cxx11::basic_stringstd::运算符+|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4929|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"const std::__cxx11::basic_string"派生的|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.tcc|1147|注意:候选者:模板std::__cxx11::basic_string std::operator+(const_CharT*,const std::__ cxx11:;basic_string&)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.tcc|1147|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:类型"const_CharT*"answers"Odcinek"不匹配|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.tcc|1163|注意:候选者:模板std::__cxx11::basic_string std::operator+(_CharT,const std::__ cxx11:;basic_string&)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.tcc|1163|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:类型'const-std::__cxx11::basic_string'和'int'不匹配|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4966|注意:候选者:模板std::__cxx11::basic_string std::运算符+(const std::__ cxx11:;basic_string&,const_CharT*)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4966|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"const std::__cxx11::basic_string"派生的|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4982|注意:候选者:模板std::__cxx11::basic_string std::运算符+(const std::__ cxx11:;basic_string&,_CharT)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4982|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"const std::__cxx11::basic_string"派生的|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4994|注意:候选者:模板std::__cxx11::basic_stringstd::运算符+|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4994|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Programowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"std::__cxx11::basic_string"派生的|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5000|注意:候选者:模板std::__cxx11::basic_stringstd::运算符+|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5000|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"const std::__cxx11::basic_string"派生的|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5006|注意:候选者:模板std::__cxx11::basic_stringstd::运算符+|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5006|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Programowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"std::__cxx11::basic_string"派生的|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5018|注意:候选者:模板std::__cxx11::basic_string std::operator+(const_CharT*,std::___cxx11::basic_string&&)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5018|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:类型"const_CharT*"answers"Odcinek"不匹配|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5024|注意:候选者:模板std::__cxx11::basic_string std::operator+(_CharT,std::__ cxx11:;basic_string&&)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5024|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Programowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:类型"std::__cxx11::basic_string"answers"int"不匹配|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5030|注意:候选者:模板std::__cxx11::basic_string std::运算符+(std::__ cxx11:;basic_string&&,const_CharT*)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5030|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Programowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"std::__cxx11::basic_string"派生的|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5036|注意:候选者:模板std::__cxx11::basic_string std::operator+(std::__ cxx11:;basic_string&&,_CharT)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5036|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Programowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"std::__cxx11::basic_string"派生的|||===生成失败:5个错误,0个警告(0分钟,1秒)===|
代码中的许多问题
1) 操作员定义中有一个额外的分号
Odcinek& operator+(int liczba);
^
2) 您的operator+
只有一个参数,但您的代码使用了两个参数。我认为解决这个问题的办法是不要把它变成朋友函数。或者,你可以把它当作朋友,但添加第二个论点。然而,这将需要对已经编写的代码进行更多的更改。
3)operator+
的实现似乎使用了一个未初始化的值
Odcinek Od;
Od.ile = Od.ile+liczba;
我猜应该是
Odcinek Od;
Od.ile = ile+liczba;
4) 最后也是最严重的一点是,您的operator+
返回一个对已不存在的对象的引用
Odcinek& operator+(int liczba)
{
Odcinek Od; // Od created here
Od.ile = ile+liczba;
Od.imie = imie;
Od.znak = znak;
return Od;
} // Od destroyed here
但是您返回了对已销毁的Od
对象的引用。答案是返回一个值,而不是引用。按值返回时,会生成Od
对象的副本并返回该副本,因此Od
已被销毁并不重要。
这里有一个更好的版本,它是否有效取决于您没有向我们展示的代码,但请尝试一下。
class Odcinek : public Figura
{
public:
Odcinek(int ile,string imie,char znak): Figura(ile,imie,znak){}
Odcinek operator+(int liczba) const;
virtual void wypisz() const;
};
Odcinek Odcinek::operator+(int liczba) const
{
Odcinek Od;
Od.ile = ile+liczba;
Od.imie = imie;
Od.znak = znak;
return Od;
}
相关文章:
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- CPP 运算符重载操作数位置 [] 与 ==
- c++运算符重载-我实际返回的操作数类型是什么
- C++ 重载:[错误] 与'operator='不匹配(操作数类型为 'String' 和"字符串")
- 运算符重载多个操作数C++
- 重载运算符:使用C++文本时的操作数顺序
- 在重载操作数中使用重载操作数"+" "<<" C++中出现大小写错误
- 重载运算符'<<'的使用不明确(操作数类型'ostream'(也称为"basic_ostream<char>")和"Person")
- 使用运算符重载时,没有运算符"<<"匹配这些操作数
- 为什么必须引用流插入重载中的正确操作数?
- 派生类的重载<<运算符表示操作数无效
- 运算符重载时出错(错误:"运算符<<不匹配(操作数类型为"std::basic_ostream<char>"和"const char [2]")
- 重载二元运算符的右操作数是否可以是基本类型的对象
- 如何修复重载操作数+
- 类型别名和运算符<<使用 ostream_iterator 重载会导致无效操作数
- 重载运算符'>>'的使用不明确(操作数类型'istream'(又名"basic_istream<char>")和"MyIncreEx")
- VC++ SFINAE 给出错误 C2070:"重载函数":操作数大小非法
- 混合数字类操作数重载C++
- 将右值引用作为左操作数重载加法操作符被认为是一种良好的做法
- c++中为一个操作数重载二进制操作符