函数重载使用枚举

时间:2017-09-15 06:19:28

标签: c++ enums overloading

我正在浏览函数重载的示例,并遇到了以下示例:

#include <string>
#include<iostream>

using namespace std;

enum e1 {a1, b1, c1};
enum e2 {a2, b2, c2 = 0x80000000000 };

string format (int){
    cout<<1;
}
string format (unsigned int){
    cout<<2;
}


int main () { 
    format (a1);
    format (a2);
    return 0; 
}

使用gcc 5.4.0,format(a1)编译并调用format(int)(显示1作为输出)。但是,编译format(a2)时,会出现以下错误:

 call of overloaded 'format(e2)' is ambiguous

format(a2)format(a1)不应该有相同的输出/错误吗?

1 个答案:

答案 0 :(得分:1)

enum e2 {a2, b2, c2 = 0x80000000000 };

文字0x80000000000的类型为long。常规enum(不是enum class)的基础类型足以容纳其所有值 7.2 [dcl.enum] ,因此e2必须至少long

另一方面,e1的值都适合int / unsigned int,因此其基础类型必须是其中之一。

I tested it on godbolt时,e1的基础类型为unsigned int,基础类型e2unsigned long。因此,在调用函数时,format(a1)明确地调用unsigned int版本,但format(a2)现在必须从unsigned long转换,因此不清楚调用哪个函数。