【发布时间】:2018-03-24 19:57:09
【问题描述】:
我阅读了与将 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 进行了同样的尝试,但它给了我同样的错误。但它适用于原始指针,但不适用于智能指针,我不知道为什么?
提前致谢。
【问题讨论】:
-
尝试将
inline放在__fastcall之后。这是一个链接问题。所以,不知何故,这个函数永远不会把它变成一个 obj 文件。即使它可能永远不需要,因为它很容易内联。如果您明确声明它inline,这会告诉链接器,如果它确实需要定义它需要在任何地方发出它,那么该定义将不仅仅是位于某个随机的.obj文件中。
标签: c++11 smart-pointers unique-ptr