编译错误 - 没有匹配函数来调用'Exception :: Exception(Exception)'

时间:2010-01-28 18:35:18

标签: c++

我暂时无法解决这个问题。我很乐意提供一些建议。

当我尝试抛出异常(自己创建的Java风格)

throw Exception ();

编译器提出抗议:

  

DataTypes / Date.cpp:24:错误:没有匹配函数来调用`Exception :: Exception(Exception)'   DataTypes / Date.cpp:24:错误:抛出表达式

它不适用于我拥有的任何构造函数。问题是什么? 这是Exception的头文件:

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;

};

我应该提一下,当我只留下隐式构造函数时,第二个就是它。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

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

详细说明:

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

答案 1 :(得分:2)

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

编辑:

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