能否用typedef重复定义同一个类型名

oniisama 2010-06-13 05:08:29
C++ Primer 4th中文版P382最后一行说:一旦一个名字被用作类型名,该名字就不能被重复定义,然后给出如下代码:
typedef double Money;
class Account
{
public:
Money balance(){return bal;} //uses global definition of Money
private:
//error:cannot change meaning of Money
typedef long double Money;
Money bal;
};


但是这段代码我用VC6.0能编译成功,而且P385给出的练习中,Type也被定义了两次,代码如下:
typedef string Type;
Type initval();

class Exercise
{
public:
//...
typedef double Type;
Type setVal(Type);
Type initval();
private:
int val;
};

Type Exercise::setVal(Type parm){
val=parm+initval();
}


由于Exercise中声明的setVal返回类型为double,而类外定义的setVal返回类型为string,所以出错,那就是说其实用typedef重复定义同一个类型名是可以的?那不就跟之前说的矛盾了?
...全文
2017 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
selina6874 2011-09-09
  • 打赏
  • 举报
回复
作用域不同,不是重复
tang21814 2010-06-13
  • 打赏
  • 举报
回复
看来C++ Primer 4th中文版的错误还真不少啊...
我记得里面还说可以重载创建新的操作符 比如说 **
...
而且还举了个例子...
arong1234 2010-06-13
  • 打赏
  • 举报
回复
如果你理解“类型一旦定义就不可改变”就不会如此想了。两个类型虽然都叫Money,但是他们是不同的类型[Quote=引用 13 楼 oniisama 的回复:]
作者所说的cannot change meaning of Money,这里的Money是指第一行typedef double Money;里的Money吧。那
在typedef long double Money;之后定义的成员变量Money bal;里的类型Money是不是已经改变了呢?
[/Quote]
liutengfeigo 2010-06-13
  • 打赏
  • 举报
回复
~!~
oniisama 2010-06-13
  • 打赏
  • 举报
回复
作者所说的cannot change meaning of Money,这里的Money是指第一行typedef double Money;里的Money吧。那
在typedef long double Money;之后定义的成员变量Money bal;里的类型Money是不是已经改变了呢?
arong1234 2010-06-13
  • 打赏
  • 举报
回复
需要注意的是:一个类型一旦定义,就是不可修改的。因此如果你理解这点,就不会被作者那句话误导了。我估计作者是假定所有人都知道这个[Quote=引用 11 楼 arong1234 的回复:]
因为当你在类内部声明函数Type initval时,Type是内部的类型,当你在类外部实现这个函数时Type Exercise::initval中的Type实际是外部类型Type,你实际不是改变了一个类型的定义,而是换了一个完全不同的类型。作者的标注有点misleading

引用 10 楼 oniisama 的回复:
大家都说是全局定义和局部定义的问题,那为什么类内定义的类型,作者要标出/……
[/Quote]
arong1234 2010-06-13
  • 打赏
  • 举报
回复
因为当你在类内部声明函数Type initval时,Type是内部的类型,当你在类外部实现这个函数时Type Exercise::initval中的Type实际是外部类型Type,你实际不是改变了一个类型的定义,而是换了一个完全不同的类型。作者的标注有点misleading
[Quote=引用 10 楼 oniisama 的回复:]
大家都说是全局定义和局部定义的问题,那为什么类内定义的类型,作者要标出//error:cannot change meaning of Money这个错误呢?
[/Quote]
oniisama 2010-06-13
  • 打赏
  • 举报
回复
大家都说是全局定义和局部定义的问题,那为什么类内定义的类型,作者要标出//error:cannot change meaning of Money这个错误呢?
zhangweiit 2010-06-13
  • 打赏
  • 举报
回复
如果两个类型,都是全局的,那会报错redefinition

如果一个在类里,一个在全局,类里会屏蔽全局的

jphaoren 2010-06-13
  • 打赏
  • 举报
回复
不是编译器的事,局部定义 和全局定义的问题。
lvshaoqing 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 arong1234 的回复:]
明明是两个类型,一个是全局的Type,还有一个是类内部类型
桃大妈也别把啥都归纳为编译器不好,这明显是楼主理解出了问题
[/Quote]

楼上的正解。
taodm 2010-06-13
  • 打赏
  • 举报
回复
另外,貌似这个问题是上effective c++的,答案不是那么简单的。
taodm 2010-06-13
  • 打赏
  • 举报
回复
我又没评论他任何结论,只是告诉了他自己找答案的方案。
arong1234 2010-06-13
  • 打赏
  • 举报
回复
明明是两个类型,一个是全局的Type,还有一个是类内部类型
桃大妈也别把啥都归纳为编译器不好,这明显是楼主理解出了问题
lvshaoqing 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
再多换几个编译器试试后再讨论。
另外,VC6得到的任何结果都不具有参考价值。珍惜生命,远离vc6
[/Quote]


VC6支持标准的估计是70%到80%。 为什么会有这样那样的问题,是因为,当时标准还未出现。 当然现在有
c99的,所以就不一样了。
bitxinhai 2010-06-13
  • 打赏
  • 举报
回复
typedef string Type;
Type initval();

class Exercise
{
public:
//...
typedef double Type;//Type的真实类型应该为Exercise::Type,我觉得应该不重复
Type setVal(Type);
Type initval();
private:
int val;
};
taodm 2010-06-13
  • 打赏
  • 举报
回复
再多换几个编译器试试后再讨论。
另外,VC6得到的任何结果都不具有参考价值。珍惜生命,远离vc6

64,654

社区成员

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

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