使用Union 出错???急救!!!

cdwy411 2004-10-19 04:10:59
class CTest
{
public:
class Cls_tt
{
public:
print(){} ;
private:
long i ;
};

struct Stru_tt
{
long i
long j
};
union{
Cls_tt t1 ;
Stru_tt t2 ;
};
};

为什么会出现错误:
e:\test.h(148) : error C2620: union '__unnamed' : member 't1' has user-defined constructor or

non-trivial default constructor
这种情况该怎么用???
...全文
571 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdwy411 2004-10-20
  • 打赏
  • 举报
回复
谢谢 lynnboy(lynnboy) ( ) ,正如你所说,接分!!!
dot99 2004-10-20
  • 打赏
  • 举报
回复
member 't1' has user-defined constructor or non-trivial default constructor
写清楚了啊~~~~~

union来组织数据的,你却放了一个类进去~
carylin 2004-10-19
  • 打赏
  • 举报
回复
不同意楼楼上的,
pongba 2004-10-19
  • 打赏
  • 举报
回复
你用的什么编译器,代码没有错误
lynnboy 2004-10-19
  • 打赏
  • 举报
回复
non-trivial default constructor 就是编译器为需要生成默认构造函数的类生成的构造函数。
如果程序员没有给类提供任何构造函数,C++ 语言仍然要保证对象语义的正确性。当创建一个类的对象后,这个对象一定是语义上完整的该类的对象。
C++ 把最简单的类处理为与 C 的 struct 行为一致:新建的类对象直接在运行栈或堆中分配内存,对内存的内容不作任何操作。这个行为是一种逻辑上的“空构造函数”,被 C++ 标准成为 trivial default constructor,这种“最简单的类”的行为称为 bitwise,就是位语义。
当编译器认为一个类通过这种方式不能保证对象语义时,就会为类合成一个默认构造函数,这就是 non-trivial default constructor。
什么情况时一个类不能保证它的位语义呢?就是对象的内部有不满足位语义的任何东西存在的时候。具体来说,对象内部通常可能有三种东西:基类,成员,用于实现语言的其他东西,这个“用于实现语言的其他东西”通常就是为了实现 virtual 函数和基类的虚函数表指针 vptr。这个通常被分为四种情况,它们都会导致默认构造函数的合成:
1。如果类非 virtual 继承于任何有 public 或 protect (包括编译器合成的,但不是trivial的)默认构造函数的基类。当然,如果基类没有可调用的默认构造函数,则会导致合成失败。
2。如果类具有任何有 public (包括编译器合成的,但不是trivial的)默认构造函数的类对象成员。
3。如果类具有虚函数,则这个类具有 vptr,此时类的(如果有基类,则相应基类的)vptr 必须指向正确的 vtbl。
4。如果类 virtual 继承于任何虚基类,则该类具有 vptr(大多数 C++ 编译器在 vtbl 种保存虚基类的偏移量,这时类具有 vptr;有些 C++ 编译器在类中直接保存虚基类指针),vptr 必须指向正确的 vtbl(虚基类指针同样要求正确初始化)。
如果一个类定义没有用户定义构造函数,并且满足如上条件中的任何一条,都需要合成一个 non-trivial default constructor。在该合成的构造函数中完成的操作是对每一个基类和成员按声明顺序调用其默认构造函数(如果某个基类或成员是 bitwise 的,则不作操作),并在这个过程中适当的时候对 vptr 等指针作适当的初始化。(而这个“适当的时候”和“适当的初始化”所遵循的原则仍然是“保证对象语义”。)
lynnboy 2004-10-19
  • 打赏
  • 举报
回复
union 定义有一定的限制:作为 union 的成员的类型,不能有构造函数。
这个是保持基于对象模型的语义的直接逻辑结果。
我们可以考虑,union 的语义是“是类型A,也是类型B……”:
union U{
A a;
B b;
} u;
如果我们访问 u 的成员:
u.a; // 这是一个A
u.b; // 这是一个B
在语义上,u.a 就是一个类型 A 的对象,同样,u.b 就是一个类型 B 的对象。
可是,如果类型 A 或 B 有构造函数,也就意味着没有实施构造函数的该类型对象是无效的,违反对象语义。另一方面,我们又不能每次访问 union 内的对象时都调用构造函数,所以 C++ 标准禁止 union 成员具有构造函数。
cdwy411 2004-10-19
  • 打赏
  • 举报
回复
对不起,以上错误是我写的笔误.
不知道大家关心"member 't1' has user-defined constructor or non-trivial
default constructor"这个错误吗?
我现在寻求 MSDN 上错误码为" C2620" 的这个错误的解法.
请大家不要叫我改该定义的结构,谢谢!!!
pacman2000 2004-10-19
  • 打赏
  • 举报
回复
没什么问题,除了上面说的少了;和函数定义没写全。
柯本 2004-10-19
  • 打赏
  • 举报
回复
如果你用gcc,必须定义:

int print() { return 0;} ;


void print() {} ;

其它没问题,我用vc,bcb,gcc编译通过

柯本 2004-10-19
  • 打赏
  • 举报
回复

class CTest
{
public:
class Cls_tt
{
public:
print() { return 0;} ;
private:
long i ;
};

struct Stru_tt
{
long i ; // 少;
long j ; // 少;
};
union{
Cls_tt t1 ;
Stru_tt t2 ;
};
};

kobefly 2004-10-19
  • 打赏
  • 举报
回复
可以这么改:
union name{
Cls_tt t1 ;
Stru_tt t2 ;
};
或者
union nameT{
Cls_tt t1 ;
Stru_tt t2 ;
}name;
上边的是一个类型
下边的name是一个公用体的实例
kobefly 2004-10-19
  • 打赏
  • 举报
回复
union{
Cls_tt t1 ;
Stru_tt t2 ;
};
结构体没有命名啊!!
icymirror 2004-10-19
  • 打赏
  • 举报
回复
错误信息提示你联合体没有命名。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧