我暂时解决不了这个问题。我很乐意给你一些建议。
当我试图抛出一个异常时(用Java风格自创建异常)
throw Exception ();编译器提出抗议:
数据类型/Date.cpp:24: error:对‘Exception::Exception(异常)’数据类型/Date.cpp:24: error: in引发表达式的调用没有匹配函数
它不适用于我所拥有的任何构造函数。有什么问题吗?下面是异常的头文件:
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;
};我应该提到,当我只保留隐式构造函数和第二个构造函数时,它可以工作。
谢谢你的帮助。
发布于 2010-01-28 18:40:10
您的复制构造函数被标记为显式,这意味着它实际上不是一个复制构造函数。抛出的对象必须是可复制的。
详细说明:
explicit关键字意味着不能使用单个参数构造函数隐式地将参数类型的变量转换为构造类型的对象。您必须使用类名显式地执行此操作。例如,来自const char*的构造函数是显式的,因此编译器将永远不会隐式地将const char*转换为Exception类型的新对象,除非您写出Exception("some string here")。另一方面,您确实希望编译器能够隐式地将一个Exception对象转换为另一个Exception对象(复制构造函数就是这样做的!),因此,通过使用本来是复制构造函数的构造函数并使用explicit关键字标记它,您完全消除了它复制的能力。
发布于 2010-01-28 18:42:26
通过throw Exception();创建异常类的本地实例,然后将其复制到堆栈中。从复制构造函数中删除explicit。
编辑:
如果您的复制构造函数没有做任何事情,只需省略它。编译器将为您生成一个。
https://stackoverflow.com/questions/2156945
复制相似问题