代码之家  ›  专栏  ›  技术社区  ›  Ravisangar

如何将unique\u ptr对象作为参数传递给作为库的类

  •  0
  • Ravisangar  · 技术社区  · 7 年前

    我阅读了有关将unique\u ptr作为参数传递给类构造函数的所有问题和答案,这些答案适用于exe中的类。但在这里,我试图将唯一的\u 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\u ptr尝试了同样的方法,但它给出了相同的错误。但它可以很好地处理原始指针,但不能处理智能指针,我不知道为什么?

    提前谢谢。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Omnifarious    7 年前

    这里的问题是链接问题。现在,到底发生了什么对我来说很难说,因为我从来没有在Windows环境中工作过,而链接在Unix/Linux和Windows环境之间(虽然非常相似)有一些明显的区别。

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

    这假定您将类和定义的声明放在一起表示定义与类一起位于头文件中。

    当编译器看到它被声明时 内联 它将向每个需要的编译单元发出定义。然后链接器应该消除所有重复的定义。

    如果您真的要在 .cpp 文件与 .hpp 类所在的文件,并且编译器 。cpp公司 将文件归档到 .obj 最终使其成为 .lib .dll 你在创建可执行文件时链接到的,那么我不知道问题是什么。如果是这种情况,您应该使用开发环境附带的工具来查看库或dll中实际有哪些符号,因为不知何故构造函数定义的符号并不存在。