C++ 强制调用构造函数而不是函数样式转换
我有一个自定义的异常类: Exception.cc:C++ 强制调用构造函数而不是函数样式转换,c++,C++,我有一个自定义的异常类: Exception.cc: #include "Exception.h" const char* Exception::getMessage() { return strerror(this -> error_code); } int Exception::getErrno() { return this -> error_code; } Exception::Exception(int errno) { this -> error
#include "Exception.h"
const char* Exception::getMessage()
{
return strerror(this -> error_code);
}
int Exception::getErrno()
{
return this -> error_code;
}
Exception::Exception(int errno)
{
this -> error_code = errno;
}
例外.hh
#ifndef __EXECPTION_H__
#define __EXECPTION_H__
#include <string.h>
class Exception
{
private:
int error_code;
public:
const char* getMessage();
int getErrno();
Exception(int errno);
};
#endif
看起来编译器误解了抛出异常(errno)代码>。我在那里调用构造函数,为什么它被当作类型转换?没有“调用构造函数”这样的事情<代码>异常(errno)
、(异常)errno
和静态(errno)
在代码中都是等效的
也就是说,问题的根源在于其他方面:您使用的是保留名称,这是一个标准宏(具有实现定义的内容)。宏不考虑C++范围,所以构造函数声明实际上是
Exception(int whatever_errno_actually_expands_to);
在我的gcc中,这实际上是:
Exception(int (*__errno_location ()));
解决方案:不要使用保留名称作为标识符。没有“调用构造函数”这样的事情<代码>异常(errno)、(异常)errno
和静态(errno)
在代码中都是等效的
也就是说,问题的根源在于其他方面:您使用的是保留名称,这是一个标准宏(具有实现定义的内容)。宏不考虑C++范围,所以构造函数声明实际上是
Exception(int whatever_errno_actually_expands_to);
在我的gcc中,这实际上是:
Exception(int (*__errno_location ()));
解决方案:不要使用保留名称作为标识符。我知道这不是您问题的答案,但为什么不使用向量?您可以在两个方向上迭代它,并且可能不需要反转缓冲区。如果没有,可以使用STL反转缓冲区:标准保留带有两个下划线的名称。@PeterT:buffer.h包括
cerror
。对errno.h来说不是一样吗@Jens:我是C++新手。所以你看,我把C和C++混合起来。从C开始的头,例如CTSdLIB,把所有C类放在名字空间STD中。所以如果你想从CelrNO访问ErrNO,你必须用STD::我想:-问题是语言看起来很相似,但是成语很不同。许多接受的C实践在C++中被劝阻是有充分理由的。根据你作为程序员的经验,我建议阅读一些关于C++的文献,例如Scott Meyers的书。还有一些核心准则提供了很好的指导:。我知道这不是你问题的答案,但你为什么不使用向量呢?您可以在两个方向上迭代它,并且可能不需要反转缓冲区。如果没有,可以使用STL反转缓冲区:标准保留带有两个下划线的名称。@PeterT:buffer.h包括cerror
。对errno.h来说不是一样吗@Jens:我是C++新手。所以你看,我把C和C++混合起来。从C开始的头,例如CTSdLIB,把所有C类放在名字空间STD中。所以如果你想从CelrNO访问ErrNO,你必须用STD::我想:-问题是语言看起来很相似,但是成语很不同。许多接受的C实践在C++中被劝阻是有充分理由的。根据你作为程序员的经验,我建议阅读一些关于C++的文献,例如Scott Meyers的书。还有一些核心指南提供了良好的指导:。
Exception(int whatever_errno_actually_expands_to);
Exception(int (*__errno_location ()));