我们有一个自定义错误类,每当我们抛出异常时都会使用它:
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,因为没有定义复制构造函数。
我在编译定义并首先抛出 a 的库时第一次看到错误CCLAError
,这就是为什么我要继续进行,好像这是原因。
我能够通过更改来解决错误
throw CCLAError( ... )
到
throw new CCLAError( ... )
和
catch(CCLAError& e)
{
throw e;
}
到
catch(CCLAError& e)
{
throw;
}
但是,我不明白为什么重新抛出捕获的异常会调用复制构造函数。我错过了一些完全明显的东西吗?随后,为什么删除包含对捕获的异常的引用的变量会导致复制构造函数不被调用?