A类{..};typedef a a_t;Union u{...; a_t ai;...};不起作用

  • 本文关键字:ai 不起作用 Union typedef c++
  • 更新时间 :
  • 英文 :


我为一个固定点数写了一个类,类q1516 {...},有很多重载的东西。它似乎工作得很好。q1516_t应尽可能像基本数据类型(如复数等(。
该类的唯一数据字段是一个 32 位无符号字。
我还定义了一个类型:typedef q1516 q1516_t;我可以按预期使用它(我了解到这不会调用构造函数,而是调整测试用例(。至少我没有收到编译器消息并且测试通过了。

现在我想将联合定义为返回值的一部分:

typedef union uTelemetryDataValue {
    float       f;
    q1516_t     q;
} tdValue_t;

但它不起作用,消息是:
"q1516_t"不命名类型。
头文件按正确的顺序包含:"q1516.h",在包含上述 uTelemetryDataValue 声明的标头之前。

我怎样才能做得更好?我已经阅读了15501649/c-typedef-class-use:好的,typedef是旧的C,但是应该把什么放到uTelemetryDataValue中?
我的主要目标(除了干净和简单的C++(是允许选择返回的结构包含浮点数或定点数(其中哪一个在其他地方指定(。

(Eclipse-cdt,Mingw,Win8.1,但最终目标将是嵌入式设备(

提前非常感谢你,
赫穆特

感谢您的评论,我尽可能彻底地检查了它们。

@n在线程15501649中,我读到:"...它在C++中没有像在C. OTOH中那样提供符号优势,它会导致限制,因为这种语法不提供任何构造或破坏机制。我将其解释为不调用构造函数。但这不是问题的中心。
@HolyBlackCat:我想让你不读所有这些,我的问题不是调试,而是"正确"地做。但是:谢谢你的提议。
@5gon12eder:我相信你是对的。我要求不使用typedefs的"正确方法"。
我在其他地方也得到了帮助,连同迪特、丹和约翰的评论,我们得到了一些答案。

迪特,没有包含循环,但仍然错误的顺序(:-}(,对不起。这些现在是要编写的模块MLinkDrv的第一行.cpp(它仍然很空(:

#include <stdint.h> // uint32_t etc.
#include "../q1516/q1516.h" // contains the class definition for q15161
#include "TelemetryData.h" // contains the union declaration for uTelemetryDataValue
#include "MLinkDrv.h" // uses declarations in q1516.h and TelemetryData.h
using namespace std;

抱歉,当我写问题时,我监督了订单仍然错误:
MLinkDrv.h,然后
Q1516.H 然后
遥测数据.h.
但是编译器消息是在TelemetryData.h中传递的,而不是预期的MLinkDrv.h,因此我监督了错误。这是我唯一的借口...

重新排序后,错误消息的质量有所提高:编译器无法将 q1516(或 q15161_t(放入联合中,因为类 q1516 具有重要的复制构造函数。好一点。调整 q1516 类后,我得到了一个新的惊喜:
在 C/C++ 构建中 |设置 |工具设置我不得不添加" -std=c++11",
显然,像将浮点数和类(其数据中有一个uint32_t(放入联合中这样简单的事情需要 C++11。

所以这个问题可能没有明确回答:在"好C++"中如何表述如下结构,我补充说:如果可能的话,不使用C++11:

class cTDItem {
private:
    tdInfo_t    id; //...
    tdValue_t   value;
    uint32_t    timestamp;
...
}

id 包含值类型的信息等。这是一个简单的结构,我在这里确实使用 typedef。值是并集:

typedef union uTelemetryDataValue {
    float       f;
    q1516_t     q;
} tdValue_t;

第一个答案:好的,我可以/应该写类名q1516而不是类型q1516_t。

感谢您到目前为止的帮助,祝您圣诞快乐!

赫穆特

最新更新