如何将 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 中实际有哪些符号,因为构造函数定义的符号不知何故不存在。
我阅读了所有与将 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 中实际有哪些符号,因为构造函数定义的符号不知何故不存在。