牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

愚蠢的错误:关于C2533错误

Edit(2007/4/17):很抱歉的咒骂了VC编译器,其实只是自己的问题,特此修订一下这个日志,还让那么人看了,我想应该订正一下才好.在此表示抱歉了.

今天写了一个类,头文件声明如下:
class CConfigManager
{

public:
    CConfigManager(
void);
    
~CConfigManager(void);
}
结果编译器给我报错:

error C2533: CConfigManager::CConfigManager' : constructors not allowed a return type

我查了下MSDN,MSDN上面说:
编译器错误 C2533 
 
 语言筛选器: 全部 语言筛选器: 多个 语言筛选器: Visual Basic 语言筛选器: C# 语言筛选器: C++ 语言筛选器: J# 语言筛选器: JScript 
 Visual Basic(声明)
 Visual Basic(用法)
 C#
 C++
 J#
 JScript

错误消息
“identifier”: 构造函数不允许返回类型


构造函数不能有返回类型(甚至不能有 void 返回类型)。

下面的示例生成 C2533:

// C2533.cpp
// compile with: /c
class X {
public:
   X();  
};

int X::X() {}   // C2533
X::X(){}   // OK

我当时没有弄明白.实质上编译器的角度来看这是正确的.
当头文件被include以后,也就和cpp文件合成一个文件了,
这个时候就是这种情况了:

class CConfigManager 

public
CConfigManager(
void); 
~CConfigManager(void); 
}
 

CConfigManager::CConfigManager() 
{
}


 

这个时候,实际上就像这样了:

class CConfigManager{} CConfigManager::CConfigManager()
{}

 

也就是说我这个时候定义了一个类型,并且它是构造函数的返回值类型.编译器告诉我说:

constructors not allowed a return type构造函数不允许返回一个类型.
构造函数是没有返回值类型的....

只是我当时粗心大意,和理解的问题造成这个日志的.
现在特别修改了它,希望其他碰到此类问题的朋友有一些深刻的意义.
我有什么不对之处,也请各位不吝赐教,批评指正.

posted on 2006-10-12 17:03 杨粼波 阅读(2450) 评论(9)  编辑 收藏 引用 所属分类: 原创文章C++

评论

# re: 愚蠢的错误,愚蠢的VC编译器:关于C2533错误 2006-10-12 23:51 wlw

用VA小助手可以避免类似问题  回复  更多评论   

# re: 愚蠢的错误,愚蠢的VC编译器:关于C2533错误 2006-10-13 05:40 happia

编译器经常会这样子的,还是尽量避免这些低级错误的好  回复  更多评论   

# re: 愚蠢的错误,愚蠢的VC编译器:关于C2533错误 2006-10-13 13:59 Pixar

编译器一点都没错,看下c++标准去吧  回复  更多评论   

# re: 愚蠢的错误,愚蠢的VC编译器:关于C2533错误 2006-10-13 22:00 tx7do

怎么不是编译器错误,本来是这里出错,结果编译器说是那边出错了,这个不正确指明,难道还需要靠这样的经验来作用?那真是笑话了.

PS:VA不好使,每次启动都要解析整个工程,太讨厌了.  回复  更多评论   

# re: 愚蠢的错误,愚蠢的VC编译器:关于C2533错误 2006-10-14 18:59 syy

说句实话,这个错误低级了些,少写分号的话绝对是初学者才会犯的问题。  回复  更多评论   

# re: 愚蠢的错误,愚蠢的VC编译器:关于C2533错误 2006-10-16 12:00 tx7do

呵呵,是很丢人。
最近经常犯低级错误。
不过也好,
长见识了。  回复  更多评论   

# re: 愚蠢的错误,愚蠢的VC编译器:关于C2533错误 2007-01-16 23:10 yy

我看到第一个源码,就知道错误是什么了,因为我也犯过。。。  回复  更多评论   

# re: 愚蠢的错误,愚蠢的VC编译器:关于C2533错误 2007-04-17 15:15 faye wong

编译器没有错,编译器已经给你指明了错误
如果没有;
class CConfigManager将成为这个下面一个函式的类型。

例如:
struct xx
{
}//注意这里没有加;

main()
{
}

这将把函式main的类型定义为struct xx,很显然,你的本意并不是如此。
所以你错怪编译器了,仔细看看c/c++基础吧。
:)   回复  更多评论   

# re: 愚蠢的错误,愚蠢的VC编译器:关于C2533错误 2007-04-17 22:01 随意

这都是多久前的事情了.
我当时学C++3个月都不到.
楼上所说也不够准确,xx被解析为main的返回值类型了.
但是确实是的.
xx变成了 main的返回值了.

我那里inlude以后,
也就是这样了:

class CConfigManager
{

public:
CConfigManager(void);
~CConfigManager(void);
}

CConfigManager::CConfigManager()
{}

也就是说,我定义了一个类型 CConfigManager,并且它为构造函数的返回值的类型了.
故而会报错:说constructors not allowed a return type.
当时没有经验,
其实编译器也只能做到这么多.
没有分号,编译器以为这一行还没有结束,于是向下解析找到了构造函数,
它便将之解析成构造函数的返回类型了.  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理