首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译错误-没有调用“Exception::Exception(Exception)”的匹配函数

编译错误-没有调用“Exception::Exception(Exception)”的匹配函数
EN

Stack Overflow用户
提问于 2010-01-28 18:35:18
回答 2查看 3.6K关注 0票数 2

我暂时解决不了这个问题。我很乐意给你一些建议。

当我试图抛出一个异常时(用Java风格自创建异常)

代码语言:javascript
复制
throw Exception ();

编译器提出抗议:

数据类型/Date.cpp:24: error:对‘Exception::Exception(异常)’数据类型/Date.cpp:24: error: in引发表达式的调用没有匹配函数

它不适用于我所拥有的任何构造函数。有什么问题吗?下面是异常的头文件:

代码语言:javascript
复制
class Exception
{

public:
 Exception(void);
    explicit Exception(const char *);
    explicit Exception(const Exception &);
    Exception(const char *, const Exception &);
 virtual ~Exception();

 const char * message;
 const Exception & cause;

};

我应该提到,当我只保留隐式构造函数和第二个构造函数时,它可以工作。

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-28 18:40:10

您的复制构造函数被标记为显式,这意味着它实际上不是一个复制构造函数。抛出的对象必须是可复制的。

详细说明:

explicit关键字意味着不能使用单个参数构造函数隐式地将参数类型的变量转换为构造类型的对象。您必须使用类名显式地执行此操作。例如,来自const char*的构造函数是显式的,因此编译器将永远不会隐式地将const char*转换为Exception类型的新对象,除非您写出Exception("some string here")。另一方面,您确实希望编译器能够隐式地将一个Exception对象转换为另一个Exception对象(复制构造函数就是这样做的!),因此,通过使用本来是复制构造函数的构造函数并使用explicit关键字标记它,您完全消除了它复制的能力。

票数 4
EN

Stack Overflow用户

发布于 2010-01-28 18:42:26

通过throw Exception();创建异常类的本地实例,然后将其复制到堆栈中。从复制构造函数中删除explicit

编辑:

如果您的复制构造函数没有做任何事情,只需省略它。编译器将为您生成一个。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2156945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档