首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求教高手 函数重载解析并引起二义性有关问题

2012-02-10 
求教高手 函数重载解析并引起二义性问题#include iostreamusingnamespacestdvoidfunc(int(&ra)[5]){cou

求教高手 函数重载解析并引起二义性问题
#include <iostream>
using   namespace   std;

void   func(int   (&ra)[5])
{
          cout < < "ra " < <endl;
}

void   func(int   *pi)
{
          cout < < "pi " < <endl;
}


int   main()
{
        int   a[5];
        func(a);//二义性
        system( "pause ");
        return   0;
}

为什么会引起二义性的?void   func(int   (&ra)[5])传递参数时应该不会有任何转换,而void   func(int   *pi)传递参数时应该有个左值转换,这样也会引起二义性?

再看

#include <iostream>
using   namespace   std;

void   func(const   int   (&ra)[5])
{
          cout < < "ra " < <endl;
}

void   func(const   int   *pi)
{
          cout < < "pi " < <endl;
}


int   main()
{
        int   a[5];
        func(a);
        system( "pause ");
        return   0;
}

//加上CONST限定符   DEV   C++下可正常编译,VC6下依然二义性错误,在标准C++中到底是怎么样的?


[解决办法]
重载的参数类型转换有个限定修饰转换,只影响指针。func(a)到func(const int * a);是要进行一次转换的,void func(const int (&ra)[5])不用,在这里它等价于void func(int (&ra)[5])。所以函数的调用是void func(const int (&ra)[5])。
注:限定修饰指的的是const和volatile
[解决办法]
VC6已经扔啦,只用devcpp和vs2005啦,那就好。
答案在C++ Primer上。关于重载解析的章节。
我想没人可以记熟,你去先认真看看吧。
cv修饰符在修饰形参名时无效,而指向const的指针里的const不是修饰形参名的
作为独立变量,const char * p;与char const * p;等价,而和char * cosnt p;完全不同。
作为形参void f(char * p);和void f(char * const p);等价,而和void f(const char * p);完全不同。

热点排行