C++ 防止重新定义构造函数定义的方法

C++ 防止重新定义构造函数定义的方法,c++,exception,methods,constructor,C++,Exception,Methods,Constructor,我正在编写一个定制的异常类,在std::Exceptionone上有一些附加功能。我在我的异常类中添加了一个自定义构造函数Exception(std::string details):details(details){} 后来,当我用类filenotaccessibleeexception扩展Exception并抛出它时,当我添加一个方法filenotaccessibleeexception时,我得到一个编译错误,说没有匹配的函数来调用'filenotaccessibleeexception::

我正在编写一个定制的异常类,在
std::Exception
one上有一些附加功能。我在我的异常类中添加了一个自定义构造函数
Exception(std::string details):details(details){}

后来,当我用类
filenotaccessibleeexception
扩展
Exception
并抛出它时,当我添加一个方法
filenotaccessibleeexception时,我得到一个编译错误,说
没有匹配的函数来调用'filenotaccessibleeexception::filenotaccessibleeexception(std::basic_string)'
(std::string details):异常(details){}
对于我的类来说,它工作得很好


如果不为我的所有类重新定义构造函数,就无法使构造函数正常工作吗?

您可以使用
声明继承基类的构造函数:

class FileNotAccessibleException : public Exception
{
 public:
    using Exception::Exception;
 ...
};
请参阅上的继承构造函数的详细信息


注意:这不适用于C++11之前的实现,它是添加到流行编译器(如G++和CLANG)中的最后一个C++11语言功能之一。

是的,使用继承构造函数。应该提到的是,这仅在C++11之后才受支持,因此是否可以使用它取决于希望支持的编译器。还请注意,这是有限元分析在某些编译器的C++11支持中,True添加得相当晚,例如OSX 10.8上的默认clang不支持此构造函数转发。@AdamS构造函数转发通常指的是完全其他的东西,至少在我看到它被使用时是这样。它可以是,也可以是普通转发(
std::forward
)对于构造函数,这两个构造函数都是在clang中实现的,早于继承构造函数。(我同意您的实际观点。)您忘记了该语句中的分号。