Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 强制调用构造函数而不是函数样式转换_C++ - Fatal编程技术网

C++ 强制调用构造函数而不是函数样式转换

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

我有一个自定义的异常类:

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_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 ()));