如何将 unique_ptr 对象作为参数传递给作为库的 class

How to pass unique_ptr object as argument to a class that is a library

我阅读了所有与将 unique_ptr 作为参数传递给 class 构造函数相关的问题和答案,这些答案适用于 exe 中的 classes。但是这里我试图将 unique_ptr 对象传递给预编译为静态库的 class 构造函数。

图书馆里的这个class看起来像这样,

// Class declaration (in a header file)
class TScreen
{
   private:
      std::unique_ptr<TProcess> m_process;
   public:
      __fastcall TScreen(int a, std::unique_ptr<TProcess> i_process);
};    

// The constructor definition (in a separate .cpp file)
__fastcall TScreen::TScreen(int a, std::unique_ptr<TProcess> i_process): 
m_process(std::move(i_process)) 
{ 
}

我将尝试像这样在 exe 中实例化 class TScreen,

void TScreen_Main::CallScreen()
{
   std::unique_ptr<TProcess> objprocess (new TProcess());
   std::unique_ptr<TScreen> objscreen (new TScreen(0, std::move(objprocess)));
}

我编译了库并导入到exe中。当我编译 exe 时,它​​给我一个 link 这样的错误,

[ilink32 Error] Error: Unresolved external '__fastcall TScreen::TScreen(int, std::unique_ptr<TProcess, std::default_delete<TProcess> >)' referenced from TSCREEN_MAIN.OBJ
[ilink32 Error] Error: Unable to perform link

我也对 boost::shared_ptr 进行了同样的尝试,但它给了我同样的错误。但它适用于原始指针,但不适用于智能指针,我不明白为什么?

提前致谢。

您的问题是 linking 问题。现在,我很难说到底发生了什么,因为我从来没有在 Windows 环境中工作,而 linking 与 [=29= 之间有一些明显的区别(虽然非常相似) ] 和 Windows 环境。

我的猜测是,如果您显式声明构造函数为 inline,并声明定义为 inline,它将正常工作。

这假设您将 class 的声明和定义放在一起表明定义在头文件中与 class.

当编译器看到它被声明时 inline 它会在每个需要它的编译单元中发出一个定义。 linker 然后应该删除所有重复的定义。

如果您真的在某个 .cpp 文件中定义构造函数,该文件与 class 所在的 .hpp 文件分开,并且您将 .cpp 文件编译成.obj 文件最终使它变成 .lib.dll 而你在创建可执行文件时 link 反对,那么我不知道问题是什么。如果是这种情况,您应该使用开发环境附带的工具来查看库或 dll 中实际有哪些符号,因为构造函数定义的符号不知何故不存在。