C++ 应为错误'';先例

C++ 应为错误'';先例,c++,C++,快速概述我是如何做到这一点的 创建结构 创建了.cpp文件 使用CMake创建Make文件 运行Make并收到错误 我正在尝试编译以下代码: #include <iostream> using namespace std; enum UnitType { Meter, Inch }; class Meter { double value; public: Meter(double value) : value(value) {} d

快速概述我是如何做到这一点的

  • 创建结构
  • 创建了.cpp文件
  • 使用CMake创建Make文件
  • 运行Make并收到错误
  • 我正在尝试编译以下代码:

    #include <iostream>
    using namespace std;
    
    enum UnitType { Meter, Inch };
    class Meter {
        double value;
    
        public:
            Meter(double value) : value(value) {}
            double convertTo(UnitType unit) {
                if (unit == Inch) {
                    return value * 39.3700787;
                }   
            };  
    };
    
    int main (int argc, char *argv[])
    {
        try 
        {   
            Meter meter(1.0);
        }
        catch (int e) {
            cout << "exception " << e << endl;
        }
    
        return 0;
    }
    
    #包括
    使用名称空间std;
    枚举单位类型{米,英寸};
    班计{
    双重价值;
    公众:
    米(双值):值(值){}
    双转换器(单位类型单位){
    如果(单位=英寸){
    返回值*39.3700787;
    }   
    };  
    };
    int main(int argc,char*argv[])
    {
    尝试
    {   
    米(1.0);
    }
    捕获(INTE){
    
    不能将枚举成员重命名为“Meter”或类名为“Meter”

    阅读此示例时,我突然想到了两件事

  • convertTo
    方法不会在所有代码路径上返回
  • convertTo
    方法在关闭
    }
    后有一个
  • 标识符
    Meter
    列出两次:枚举值和类名
  • 在这里,您将
    Meter
    定义为枚举值

    class Meter {
    
    …但在这里(在同一范围内),您试图将其重新定义为类的名称。这是合法的,但要在以后使用它,您必须使用
    class Meter
    ,而不仅仅是
    Meter

    class Meter meter(1.0);
    
    在我看来,即使两个名称都可以使用相同的名称,也可能会导致混淆和问题,通过简单地重命名其中一个(或两者)可以更好地避免这些混淆和问题。

    将枚举中的“Meter”更改为其他名称,因为它与类名“Meter”冲突


    其次,在“unit!=Inch”的情况下,您需要为函数“convertTo”添加一个返回值。

    将枚举类型更改为METER和Inch,因为您甚至将类名更改为METER。

    正如大家所指出的:METER既是枚举又是类名

    一个小技巧,让你保持相同的名字:

    class UnitType
    {
        public:
           enum UnitType { Meter, Inch };
    };
    
    
    int main()
    {
       // Meter enum is now inside the scope of UnitType
    
       UnitType::UnitType  type = UnitType::Meter;
       Meter               meter(1.0);
    
    }
    

    convertTo
    上,您不需要关闭
    }
    上的
    。您只需要一个
    }
    对于类
    {}
    而言,
    try
    块中的代码不能抛出任何异常(您不调用库函数,不进行动态分配,并且您的代码不抛出任何异常)。
    try
    catch
    块是完全没有必要的。或者为了更有趣的名字,
    class-Meter(1.0)@詹姆斯·麦克内利斯:如果你继续使用这样的语言,你将不得不用肥皂漱口——更糟糕的是,破译
    If.eq。然后在接下来的几年中使用=else else then=endif endif
    。哦,等等,你现在正在写C#,Fortran可能更有趣。使用全大写可能会导致传统上全大写的预处理器宏出现问题。
    class Meter meter(1.0);
    
    class UnitType
    {
        public:
           enum UnitType { Meter, Inch };
    };
    
    
    int main()
    {
       // Meter enum is now inside the scope of UnitType
    
       UnitType::UnitType  type = UnitType::Meter;
       Meter               meter(1.0);
    
    }