代码之家  ›  专栏  ›  技术社区  ›  msc

GCC:非范围枚举类型给出了一个模糊错误

  •  9
  • msc  · 技术社区  · 8 年前

    unscoped enumeration 具有 long long 叮当声 .

    但是 通用条款 编译器给出了一个模糊错误。

    #include <iostream>
    
    enum : long long { Var=5 };
    
    void fun(long long ll)
    {
        std::cout << "long long : " << ll << std::endl;
    }
    
    void fun(int i)
    {
        std::cout << "int : " << i <<  std::endl;
    }
    
    int main()
    {
        fun(Var);
    }
    

    GCC生成的错误:

    main.cpp: In function 'int main()':
    main.cpp:17:12: error: call of overloaded 'fun(<unnamed enum>)' is ambiguous
         fun(Var);
                ^
    main.cpp:5:6: note: candidate: void fun(long long int)
     void fun(long long ll)
          ^~~
    main.cpp:10:6: note: candidate: void fun(int)
     void fun(int i)
          ^~~
    

    为什么GCC编译器会出现歧义错误?

    1 回复  |  直到 8 年前
        1
  •  13
  •   songyuanyao    8 年前

    GCC是错误的。

    integral promotion

    基础类型为固定的非范围枚举类型可以转换为其基础类型。。。(从C++11开始)

    Var 转换为 int 它还需要一个 integral conversion (来自 long long 整数 ). 排名高于 在里面 overload resolution

    2) 提升:积分提升、浮点提升

    转换、布尔转换、派生的用户定义转换 类到其基

    然后 fun(long long ll) 应该更匹配。


    Here 的gcc错误报告;固定在2017年10月24日。 LIVE