【问题标题】:Way To Prevent To Redefine Constructor Definitions防止重新定义构造函数定义的方法
【发布时间】:2013-10-12 15:22:54
【问题描述】:

我正在编写一个自定义 Exception 类,与 std::exception 相比具有一些附加功能。我在我的 Exception 类中添加了一个自定义构造函数 Exception(std::string details) : details(details) {}

稍后,当我使用类FileNotAccessibleException 扩展Exception 类并抛出它时,我得到一个编译错误,说no matching function for call to ‘FileNotAccessibleException::FileNotAccessibleException(std::basic_string<char>)’ 当我向我的类添加一个方法FileNotAccessibleException(std::string details) : Exception(details) {} 时,它确实有效美好的。

有没有办法让构造函数工作,而不必为我的所有类重新定义构造函数?

【问题讨论】:

  • 是的,使用继承构造函数。

标签: c++ exception methods constructor


【解决方案1】:

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

class FileNotAccessibleException : public Exception
{
 public:
    using Exception::Exception;
 ...
};

Bjarne Stroustrup's C++11 FAQ 上查看更多关于继承构造函数的信息。

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

【讨论】:

  • 值得一提的是,这仅从 C++11 开始受支持,因此是否可以使用它取决于想要支持的编译器。
  • 另请注意,此功能是在很晚才添加到某些编译器的 C++11 支持中的,例如 OSX 10.8 上的默认 clang 不支持此构造函数转发。
  • @AdamS 构造函数转发通常指的是完全不同的东西,至少当我看到它被使用时。它可以是delegating constructors,也可以只是简单地转发(std::forward)到构造函数,这两者都是在继承构造函数之前在clang中实现的。 (我同意你的实际观点。)
  • 您忘记了该语句中的分号。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2019-01-21
相关资源
最近更新 更多