编译错误:ISO C++ forbids declaration of *** with no type

本文探讨了在编程中遇到的“ISOC++forbidsdeclarationof***withnotype”错误,通过排查发现是由未解决的警告导致。文章强调了在解决编译错误时不应忽视警告的重要性,并给出了具体的排查步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://blog.hiwgy.com/2011/07/16/compile_error/

今天遇到个问题,“ISO C++ forbids declaration of *** with no type”。
错误的原因一般是:两个头文件相互include,一般可以采用#ifndef或前置声明解决该问题;
具体用法很简单,就不讲了。

我反复检查,上面的方法并没有解决该编译error。最后,我发现了cpp文件中有“#ifndef __FILENAME_HEADER”,这就是问题的所在了。
由于我是vim新建的.h文件,然后把.h文件copy为.cpp文件,忘记了把vim自动生成的__FILENAME_HEADER去掉,因此发生了几个warning,最终导致了“ISO C++ forbids declaration of *** with no type”。

结论是:编译时,不要盯着error解决error,有的error是warning导致的;要把warning消灭掉。

<think>嗯,用户遇到了一个C++编译错误。我需要仔细分析这个问题。首先,错误信息指出在AP_Vehicle.h的第119行,声明input_wzk时没有指定类型,导致ISO C++不允许这种情况。看起来用户可能在类中声明了一个静态成员函数,但漏掉了返回类型。 看用户提供的代码片段,input_wzk的声明是static input_wzk(uint32_t wzk) override final;,这里明显缺少了返回类型。正确的做法应该是在static后面加上返回类型,比如void。另外,override和final是C++11引入的修饰符,应该放在正确的位置,可能用户在这里的顺序有误,应该先写final再写override,或者检查是否正确使用。 然后用户给出了input_wzk函数的实现,返回类型是void。所以声明部分需要修正,加上void。此外,静态成员函数在类外定义时不需要再写static关键字,但用户可能在类内声明时已经正确使用了static,所以重点在于补全返回类型。 另外,在GCS_MAVLINK的handle_set_mode函数中,调用了AP_Vehicle::input_wzk(_custom_mode);,这里如果input_wzk是静态成员函数,调用方式是正确的,但需要确保类名和作用域正确。 可能的解决方案包括:在声明中添加返回类型void,调整override和final的顺序,确保函数定义与声明一致。还需要检查是否在派生类中正确重写了虚函数,因为使用了override关键字,所以基类中的对应函数应该是虚函数。 总结步骤应该是:修正函数声明的返回类型,调整修饰符顺序,检查基类虚函数声明,确保定义的函数与声明一致。可能还需要检查编译器的C++标准设置,是否支持override和final关键字,或者是否存在其他语法错误。</think>这个编译错误涉及C++语法规范问题。根据错误提示和代码片段,我们分步骤分析: 1. **错误定位**: 错误发生在`AP_Vehicle.h`第119行的成员函数声明: ```cpp static input_wzk(uint32_t wzk) override final;//wzk ``` 编译器指出`ISO C++ forbids declaration of 'input_wzk' with no type` 2. **问题根源**: - 函数声明缺少明确的返回类型 - 函数同时使用了`override`和`final`修饰符,但顺序和用法可能有误 - 静态函数的重写机制存在问题 3. **修正方案**: 步骤1:添加返回类型 ```cpp static void input_wzk(uint32_t wzk) final; // 静态函数不能使用override ``` 步骤2:调整修饰符顺序(根据C++11标准): ```cpp // 正确顺序应为 final 在前,override 在后(当同时使用时) virtual void some_func() final override; ``` 步骤3:检查基类声明: 如果这是一个重写函数,基类中必须存在对应的虚函数: ```cpp class AP_Vehicle { public: virtual void input_wzk(uint32_t wzk) = 0; // 纯虚函数示例 }; ``` 4. **调用处验证**: ```cpp AP_Vehicle::input_wzk(_custom_mode); // 静态调用方式正确 ``` 5. **关联实现代码**: 注意静态成员函数的实现不应包含`static`关键字: ```cpp // 正确实现 void AP_Vehicle::input_wzk(uint32_t wzk) { _wzk = wzk; } ``` **最终修正版本**: ```cpp // 头文件声明 class AP_Vehicle { public: static void input_wzk(uint32_t wzk) final; // 静态最终函数 // 或如果是虚函数: virtual void input_wzk(uint32_t wzk) final override = 0; }; ``` **注意事项**: 1. `static`成员函数不能是`virtual`的(二者互斥) 2. `override`只能用于虚函数重写 3. `final`可作用于类/函数,表示不可继承/重写 4. C++11标准后支持`override`和`final`作为标识符 5. 静态成员函数的定义需要在类外单独实现 建议检查整个类继承体系,确保函数修饰符的合理使用。如果该函数不需要多态特性,推荐使用静态函数方案;如果需要多态,则需要正确设置虚函数继承链。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值