在VS2015中定义了这样一个类:

  1. #include<iostream>
  2. #include<vector>
  3. #include<string>
  4. using namespace std;
  5. class Integer {
  6. public :
  7. int num = ;
  8. Integer(int num) {
  9. this->num = num;
  10. }
  11. Integer() {
  12. Integer();
  13. }
  14. bool operator< (const Integer& lh, const Integer& rh) {
  15. return rh.num < lh.num;
  16. }
  17. };

  对于重载的 < 运算符,显示如下错误:

  网上查找原因,解释如下:

  1. 1.你为Book类定义operator==作为成员函数,所以它有一个隐式的Book*参数this指针
    2. 一个双目运算符重载应该在类定义之外。 class Book { ... }; bool operator==(const Book& a, const Book & b) { return a.Return_ISBN()==b.Return_ISBN(); }

重新如下定义就对了:

  1. #include<iostream>
  2. #include<vector>
  3. #include<string>
  4. using namespace std;
  5. class Integer {
  6. public :
  7. int num = ;
  8. Integer(int num) {
  9. this->num = num;
  10. }
  11. Integer() {
  12. Integer();
  13. }
  14.  
  15. };
  16. //双目运算符重载定义在类外
  17. bool operator< (const Integer& lh, const Integer& rh) {
  18. return rh.num < lh.num;
  19. }

如果必须要在类内定义的话,只能定义为单参数的运算符函数:

  1. #include<iostream>
  2. #include<vector>
  3. #include<string>
  4. using namespace std;
  5. class Integer {
  6. public :
  7. int num = ;
  8. Integer(int num) {
  9. this->num = num;
  10. }
  11. Integer() {
  12. Integer();
  13. }
  14. bool operator< (const Integer& rh) {
  15. return rh.num < this->num; //this指针作为默认参数传入该函数
  16. }
  17.  
  18. };

此时,如果在源文件中定义了如下的模板函数:

  1. template<typename T>
  2. int compare(const T& a,const T& b)
  3. {
  4. if (a < b)
  5. return -;
  6. if (b < a)
  7. return ;
  8. return ;
  9. }

则该模板函数只接受类外定义的双目运算符:

  1. bool operator< (const Integer& lh, const Integer& rh) {
  2. return rh.num < lh.num;
  3. }

而类内定义的单参数运算符

  1. bool operator< (const Integer& rh) {
  2. return rh.num < this->num; //this指针作为默认参数传入该函数
  3. }

会被报错。

C++笔记(1)----此运算符函数的参数太多的更多相关文章

  1. 《JavaScript高级程序设计》读书笔记--ECMAScript中所有函数的参数都是按值传递的

    ECMAScript中所有函数的参数都是按值传递的.也就是说把函数外部的值复制给函数内部的参数(内部参数的值的修改不影响实参的值). 基本类型变量的复制: 基本类型变量的复制,仅仅是值复制,num1和 ...

  2. gets_s()函数的参数太少,strcpy_s():形参和实参 2 的类型不同,等c函数在Visual Studio上出现的问题, get()函数和scanf()读取字符串的区别,栈的随机性

    首先,这些C函数,在VS上要加_s后缀的原因是,这些函数存在字符串越界等问题,可以参考这篇文章,https://blog.csdn.net/silleyj/article/details/854540 ...

  3. QT学习笔记7:C++函数默认参数

    C++中允许为函数提供默认参数,又名缺省参数. 使用默认参数时的注意事项: ① 有函数声明(原型)时,默认参数可以放在函数声明或者定义中,但只能放在二者之一.建议放在函数声明中. double sqr ...

  4. Redis源码笔记--服务器日志和函数可变参数处理server.c

    前言 Redis源码中定义了几个和日志相关的函数,用于将不同级别的信息打印到不同的位置(日志文件或标准输出,取决于配置文件的设置),这些函数的定义位于 server.h 和server.c 文件中,包 ...

  5. Lua学习笔记3. 函数可变参数和运算符、转义字符串、数组

    1. Lua函数可以接受变长数目的参数,和C语言类似,在函数的参数列表中使用(...)表示函数可以接受变长参数 lua函数将参数存放在一个table中,例如arg,那么#arg可以获得参数的个数 fu ...

  6. 剑指offer笔记面试题1----赋值运算符函数

    题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString{ public: CMyString(char* pData = nullptr); CMyS ...

  7. JS笔记 运算符 函数

    1.运算符 1.位运算符 将数字转换为二进制后进行运算 只做整数运算,如果是小数的话,则去掉小数位再运算 2.位运算 1.按位 与:& 语法:a&b; 2.按位 或| 语法:a|b 任 ...

  8. Python学习笔记五,函数及其参数

    在Python中如何自定义函数:其格式为 def 函数名(函数参数): 内容

  9. python学习笔记之函数的参数

    函数的参数有位置参数和关键字参数,位置参数一定要在关键字参数的前面,位置参数的优先级是高于关键字参数的,否则会报错 def my_abs(a,b): print(a) print(b) my_abs( ...

随机推荐

  1. day4. python学习之字典

    字典和列表是最常用的数据类型,字典是一种key-value的数据类型,用{ }表示 1.字典的特性:无序的,没有下标 2.字典的使用:增删改查 info = { '20181101':"zh ...

  2. SSAS Tabular模式中关系设置不支持直接设置多对多?

    在网上文档发现一篇文章 微软BI 之SSAS 系列 - 多维数据集维度用法之一 引用维度 Referenced Dimension 有涉及到SSAS模型的关系设置 但是本人的基于表格模型的 没有关系可 ...

  3. JDK源码分析(10) ConcurrentLinkedQueue

    概述 我们要实现一个线程安全的队列有两种实现方法一种是使用阻塞算法,另一种是使用非阻塞算法.使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞 ...

  4. Mac系统升级至OS X Mavericks后Genymotion出现的问题及解决方法

    Apple的系统升级终于免费了,可开心满满地升级到OS X Mavericks后,Android模拟器之王Genymotion罢工了.遇到两个问题:1. Unable to load VirtualB ...

  5. normalize.css源码解析

    什么是normalize.css?  它是为了帮助我们统一各个浏览器的样式和消除bug的css库. 为什么需要normalize.css,有什么好处? 不像一些reset.css,normalize. ...

  6. 【Maven学习】maven中依赖的配置详解

    根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或多个项目依赖.每个依赖可以包含的元素有: groupId,artifactId和version ...

  7. 第十篇---javascript函数this关键字

    <script type="text/javascript" charset="utf-8"> //this:this对象是指运行时期基于执行环境所 ...

  8. UBUNTU 无法解析域名 解决方法

    莫名其妙的,ubuntu 无法访问外网. ping www.taobao.com  www.baidu.com 提示无效的主机名 但是ping 外网ip 都是可以PING通的. 所以断定是 dns问题 ...

  9. 16.Generator函数的语法

    1.简介 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同. 执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机 ...

  10. Idea与Eclipse操作代码的快捷方式

    1.Idea格式化代码的快捷键:ctrl+alt+L 2.在IDEA中创建了properties文件,发现默认中文不会自动进行unicode转码.如下 在project settings - File ...