关于重载二义性

C++编译器只根据函数参数表,也就是参数类型和个数进行重载版本的调用匹配,函数返回值不顶用

另外,函数默认参数时会产生二义性,代码必须这样调用才是对的。

#include <iostream>
using namespace std;

int max(int a,int b)
{
	return a<b?b:a;
}

int max(int a,int b,int c=0)
{
	cout<<"c == "<<c<<endl;
	return a<b?b:a;
}

int main()
{
	max(5,3,1);
	return 0;
}

否则就会有如下编译错误|:

时间: 2024-11-03 21:06:04

关于重载二义性的相关文章

java-[Java]关于重载方法中的可变参数列表

问题描述 [Java]关于重载方法中的可变参数列表 <Thinking in Java>第105页有一句话不理解 如何理解你应该总是只在重载方法的一个版本上使用可变参数列表,或者压根就不是用它 解决方案 就是当重载一个方法时,选择其中的一个重载使用可变参数,其他的避免使用,否则编译的时候容易出问题.具体的参看http://www.cnblogs.com/lanxuezaipiao/p/3190673.html 解决方案二: 这个道理很简单,比如说你有foo(int x int ... args

c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)

一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std; class Parent{ public: void fun(){ cout<<"Parent fun"<<endl; } }; class Child : public Parent{ public: void fun(){ cout<<"Child fun&quo

成员函数、-c++用成员函数和友元函数实现复数的加减操作,产生了二义性,麻烦各位大哥大姐解答一下,感激不尽

问题描述 c++用成员函数和友元函数实现复数的加减操作,产生了二义性,麻烦各位大哥大姐解答一下,感激不尽 我想在一个程序中用友元函数和类的成员函数实现复数的加减操作, 类中这样定义: main函数中用这几句调用的话存在二义性: c3=c1+c2;这一句就不知道到底该调用成员函数还是调用友元函数,但是重载的话只有参数类型和参数个数不同,就应该没问题的,这里该怎么解决呢? 麻烦各位大哥大姐了:下面是程序的代码, #include class Complex { public: Complex(dou

C++默认参数与函数重载 注意事项

一.默认参数在C++中,可以为参数指定默认值.在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数. 默认参数的语法与使用:(1)在函数声明或定义时,直接对参数赋值.这就是默认参数:(2)在函数调用时,省略部分或全部参数.这时可以用默认参数来代替. 注意:(1)默认参数只可在函数声明中设定一次.只有在没有函数声明时,才可以在函数定义中设定.(#add ,此句意为存在函数声明和定义两部分的时候.验证表明有这个限制,可以随便,但出于规范,在声明中指定)(2)如果一个参数设定了缺省值时,其右

C++运算符重载

C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作.例如:  class complex  {   public:    complex(double r=0.0,double I=0.0){real=r;imag=I;}    void display();   private:    double real;    double imag;  };  complex a(10,20),b(5,8);  "a+b"运算如何实现?

C++之运算符重载(1)

在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的.这一系列我将主要讲解C++中有关运算符重载方面的内容.在每一个系列讲解之前,都会有它的一些基础知识需要我们去理解.而运算符重载的基础就是运算符重载函数.所以今天主要讲的是运算符重载函数. 1.运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生.比如 int i; int i1=10,i2=10; i=i1+i2; std::cout<<

php重载数组操作符

在php中提供了许多接口用于实现一些很特定的功能,比如你想把一个对象当作array使用时,只需要实现ArrayAccess接口,当你想要foreach中能够使用一个对象时,只需要实现Iterator接口,下面给一个例子出来 class BtstoreRoot { /** * 根结点 * @var BtstoreElement */ static $root; } class BtstoreElement implements ArrayAccess, Iterator { /** * 当前所代表

wpf dispatcher.begininvoke与匹配的重载方法具有一些无效参数

问题描述 wpf dispatcher.begininvoke与匹配的重载方法具有一些无效参数 wpf dispatcher.begininvoke与匹配的重载方法具有一些无效参数,我在另外一个项目里面用这个方法就有,请问这是为什么呢? 解决方案 两个项目的.net framework 版本一样么?

c++ 重载操作符友元问题

问题描述 c++ 重载操作符友元问题 <c++ primer>里面有一段文字: Salesitem 类也是说明为何有些操作符需要设置为友元的一个好例子.它定义了一个成员操作符,并且有三个非成员操作符.这些非成员操作符需要访问私有数据成员,声明为友元: class Sales_item {friend std::istream& operator>>(std::istream& Sales_item&);friend std::ostream& ope