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

时间:2022-07-15 20:08:24
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
}

9 个解决方案

#1


语法错误。看了书就知道该怎么解决

#2


这里是typedef的问题。
S_t并不是一个对象,哪来的mem成员?!
S_t等价于struct S*,它是一个自定义的数据类型,你改成这样就可以了:
struct S
{
       int mem;
}*S_t;

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

#3


Big是类的名字,Big()是用构造函数产生一个实例。

#4


Big();是类的实例
Big是类

#5


Big 是类,
Big类的实例应该这样定义:
Big  a();
不能Big()
啊?

#6


可以
new Big();
没见过
throw Big();
这样写的
不懂是什么意思;

#7


哦...是哦,感谢loujing先.
但是关于Big()那里好像还没弄懂.
为什么throw后面接着的不是一个对象呢?
就如popy007跟 windyloft说的,我弄不明白
return会否有一样的情况呢?例如
return Big();
这样?

#8


顶一下...

#9


在c++中,如果compiler遇到某一个类的constructor,比如Big()的时候,它会

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

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

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

在吧这个instance throw到异常处理的地方。

#1


语法错误。看了书就知道该怎么解决

#2


这里是typedef的问题。
S_t并不是一个对象,哪来的mem成员?!
S_t等价于struct S*,它是一个自定义的数据类型,你改成这样就可以了:
struct S
{
       int mem;
}*S_t;

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

#3


Big是类的名字,Big()是用构造函数产生一个实例。

#4


Big();是类的实例
Big是类

#5


Big 是类,
Big类的实例应该这样定义:
Big  a();
不能Big()
啊?

#6


可以
new Big();
没见过
throw Big();
这样写的
不懂是什么意思;

#7


哦...是哦,感谢loujing先.
但是关于Big()那里好像还没弄懂.
为什么throw后面接着的不是一个对象呢?
就如popy007跟 windyloft说的,我弄不明白
return会否有一样的情况呢?例如
return Big();
这样?

#8


顶一下...

#9


在c++中,如果compiler遇到某一个类的constructor,比如Big()的时候,它会

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

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

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

在吧这个instance throw到异常处理的地方。