重载分辨率

时间:2013-08-09 17:18:46

标签: c++

据我所知,在选择两个候选函数时,编译器会更喜欢最弱匹配的函数。 例如,如果我有:

void boo(int i, char c);  
void boo(double d, int i);

代码如下:

float f = 1.0;  
char c = 'c';
boo(f,c);

第二个boo应该是首选,因为它最弱的匹配是促销,而第一个是标准类型转换。

但是当我尝试编译它时(使用gcc),我得到:

  

错误:ISO C ++说这些是模糊的,即使第一次转换的最差转换比第二次转换的最差转换要好。

有什么想法吗?

2 个答案:

答案 0 :(得分:12)

您对重载解析的理解是错误的。一般 规则(当有多个参数时)是选择 至少有一个参数更好的函数(它没有 重要的是,并没有其他人更糟糕。在 换句话说,编译器分别处理每个参数, 为它创造一套“最佳匹配”。在此之后,它需要 这些集合的并集:如果交集只包含一个 功能,你赢了。否则,这是不明确的。

答案 1 :(得分:0)

假设您调用函数f。 我认为重载解析过程是: 1。创建一组候选函数。这组函数包括所有可以从你调用f()的点访问的名为f的函数。 2。创建一组可行的功能。这组函数是候选函数的子集,每个可行函数的参数数量与您用来调用f()的参数数量一致。 3. 选择最佳的可行功能。 最佳可行功能是其参数都具有比所有其他可行功能更好或等级的隐式转换序列。 如果有多于或少于一个(不完全是一个),则会出现编译错误。 以下示例很好地演示了它:

class cat
{
public:
    cat(int);
};

void func(int, int, int, cat)
{
    std::cout << 1 << std::endl;
}
void func(int, int, double, double)
{
    std::cout << 2 << std::endl;
}

int main()
{
    func(1,2,3,4);
}

此代码生成编译错误(VS)或警告(g ++)。

以下内容将正确运行(打印1):

void func(int, int, int, double)
{
        std::cout << 1 << std::endl;
}
void func(int, double, double, double)
{
        std::cout << 2 << std::endl;
}

int main()
{
        func(1,2,3,4);
}