【问题标题】:c++ C2509 in definition of instructor using try: - catchc++ C2509 中使用 try:-catch 定义讲师
【发布时间】:2017-11-13 13:55:15
【问题描述】:

定义

A::A()
try: B()
{}
catch(Exception e) {}

在这段代码中,我有 C2509 错误。 当我尝试转到头文件中的定义(F12)或定义中的(Ctrl + F12)时,它不起作用。

我试过了

A::A()
{
 try
 { B();}
 catch(Exception e) {}
}

但这是不可能的,因为在 B 类中有一个 pure virtual 函数。

我对两者之间的区别感到困惑

try: {}
catch

try{}
catch

【问题讨论】:

  • 错误名称和快捷方式都不是 C++ 通用的。您需要在问题中逐字包含错误消息
  • 我想你已经回答了你的问题:“这是不可能的,因为在 B 类中有一个纯虚函数。”你不能实例化一个抽象类——包括在初始化列表中。
  • @virgesmith 谢谢你的回答,但是为什么我可以在'try:'之后初始化抽象类,而不是在try {}中?
  • 有没有办法编译成功?
  • @장윤지 为什么你认为在try:之后你自己说你这样做有错误时可以初始化它?

标签: c++ compiler-errors try-catch


【解决方案1】:

我现在假设 A 派生自 B。在这种情况下 1) 您可以显式初始化抽象基类,但 2) 您必须在初始化列表中实例化它,因为它必须完全构造之前 A::A() 的主体被执行。

这对我有用:

#include <stdexcept>

struct B
{
  B() { }
  virtual int f() = 0;
};

struct A : B
{
  A() try : B() { } catch(const std::exception&) { }

  int f() { return 0; }
};

int main()
{
  A a;
}

使用 g++ 5.4。我猜你的错误(你没有提供)是由于其他一些问题,例如不是从 B 派生 A,或者两个类中的虚函数定义不匹配。

【讨论】:

  • 非常感谢。正如您所假设的那样,A 源自 B。抱歉没有说出来。我发现我没有初始化所有的虚函数。它有很大帮助。 ;)
猜你喜欢
  • 2017-01-05
  • 2020-06-13
  • 2010-10-31
  • 2012-02-28
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
相关资源
最近更新 更多