【发布时间】:2012-06-01 18:25:52
【问题描述】:
我们有一个自定义错误类,每当我们抛出异常时都会使用它:
class AFX_CLASS_EXPORT CCLAError : public CObject
它定义了以下复制构造函数:
CCLAError(const CCLAError& src) { AssignCopy(&src); } // (AssignCopy is a custom function)
它最初是使用 MSVC6 (Visual Studio 2003) 编写和编译/链接的。我正在进行必要的更改以使其编译并链接到 MSVC8+ (VS 2008+)
当调用 msvc8 链接器时,我收到以下错误:
LNK2001: unresolved external symbol "private: __thiscall CObject::CObject(class CObject const &)" (??0CObject@@AAE@ABV0@@Z)
我明白错误告诉我什么:没有为 CObject 的某个子对象定义复制构造函数,因此它一直沿继承树向上直到遇到 CObject,因为没有定义复制构造函数。
我在编译定义并首先抛出 CCLAError 的库时第一次看到错误,这就是为什么我要继续进行,好像这就是原因。
我能够通过更改解决错误
throw CCLAError( ... )
到
throw new CCLAError( ... )
和
catch(CCLAError& e)
{
throw e;
}
到
catch(CCLAError& e)
{
throw;
}
但是,我不明白为什么重新抛出捕获的异常会调用复制构造函数。我错过了一些完全明显的东西吗?随后,为什么删除包含对捕获的异常的引用的变量会导致复制构造函数不被调用?
【问题讨论】:
-
您不需要也不应该在抛出原始异常时使用
new。但是您肯定需要将throw e更改为throw以重新抛出现有异常而不创建它的新实例。
标签: c++ visual-c++ exception