illegal use of this type as an expression请问这个问题该怎么解决?

hlxstephen 2006-02-04 11:00:39
class X
{
class Trouble{};
class Small:public Trouble {};
class Big:public Trouble {};
void f()
{
throw Big(); //这里如果把Big后面的括号去掉,就会产生c2275错误
}
};

//c2275错误的描述就是标题那里的
//illega use of this type as an expression
//这个错误在msdn里面也有个例子
typedef struct S
{
int mem;
}*S_t;
void func1(int *parm);
void func2()
{
func1(&S_t->mem); //c2275, S_t is a typedef
}
...全文
7501 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hlxstephen 2006-02-07
  • 打赏
  • 举报
回复
顶一下...
popy007 2006-02-07
  • 打赏
  • 举报
回复
在c++中,如果compiler遇到某一个类的constructor,比如Big()的时候,它会

生成这个类的一个instance。也就是说不论有没有一个Big类的identifier接受

这个instance,它都回存在,尽管大多数情况下都使用Big identifier = Big()

的形式。因此,对于throw Big(),compiler首先会生成Big的instance,然后

在吧这个instance throw到异常处理的地方。
Jinhao 2006-02-05
  • 打赏
  • 举报
回复
语法错误。看了书就知道该怎么解决
hlxstephen 2006-02-05
  • 打赏
  • 举报
回复
哦...是哦,感谢loujing先.
但是关于Big()那里好像还没弄懂.
为什么throw后面接着的不是一个对象呢?
就如popy007跟 windyloft说的,我弄不明白
return会否有一样的情况呢?例如
return Big();
这样?
lovedna 2006-02-05
  • 打赏
  • 举报
回复
可以
new Big();
没见过
throw Big();
这样写的
不懂是什么意思;
lovedna 2006-02-05
  • 打赏
  • 举报
回复
Big 是类,
Big类的实例应该这样定义:
Big a();
不能Big()
啊?
windyloft 2006-02-05
  • 打赏
  • 举报
回复
Big();是类的实例
Big是类
popy007 2006-02-05
  • 打赏
  • 举报
回复
Big是类的名字,Big()是用构造函数产生一个实例。
loujing 2006-02-05
  • 打赏
  • 举报
回复
这里是typedef的问题。
S_t并不是一个对象,哪来的mem成员?!
S_t等价于struct S*,它是一个自定义的数据类型,你改成这样就可以了:
struct S
{
int mem;
}*S_t;

这样,S_t才是一个对象,typedef是定义一个别名,注意typedef的用法。

65,212

社区成员

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

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