我阅读了与将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 中实例化类 Tcreen,
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,它给了我同样的错误。但是它适用于原始指针,但不适用于智能指针,我不知道为什么?
提前谢谢。
您的问题是链接问题。现在,我很难说到底发生了什么,因为我从来没有在Windows环境中工作过,而链接是Unix/Linux和Windows环境之间有一些明显差异的东西(虽然非常相似)。
我的猜测是,如果你显式声明你的构造函数是inline
的,并声明定义是inline
的,它将正常工作。
这假定您将类和定义的声明放在一起的事实表明该定义与该类一起位于头文件中。
当编译器看到它被声明inline
时,它会在需要它的每个编译单元中发出一个定义。然后,链接器应消除所有重复的定义。
如果您真的在某个与类所在的.hpp
文件分开的.cpp
文件中定义构造函数,并且您将该文件.cpp
编译为.obj
文件,最终使其成为您在创建可执行文件时链接的.lib
或.dll
,那么我不知道问题是什么。如果是这种情况,则应使用开发环境应附带的工具查看库或 dll 中实际存在哪些符号,因为构造函数定义的符号不知何故不存在。