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

时间:2018-03-24 19:57:09

标签: c++11 smart-pointers unique-ptr

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

库中的这个类看起来像这样,

// 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中实例化类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时,它给我一个像这样的链接错误,

[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,它给了我同样的错误。但它适用于原始指针,但没有智能指针,我无法弄清楚为什么?

提前致谢。

1 个答案:

答案 0 :(得分:0)

这里的问题是一个链接问题。现在,我正在做的事情很难说,因为我从不在Windows环境中工作,而且链接是(虽然非常相似)在Unix / Linux和Windows环境之间存在一些明显的差异。 / p>

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

这假设您将类和定义的声明放在一起这一事实表明该定义位于带有类的头文件中。

当编译器发现它声明为inline时,它会向需要的每个编译单元发出一个定义。然后,链接器应该删除所有重复的定义。

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