【发布时间】:2018-09-06 03:25:05
【问题描述】:
我有一个像这样定义明确的类,
class A
{
public:
A();
A(int a);
A(const A& o);
A(A&& o);
~A();
A& operator=(const A& o);
A& operator=(A&& o);
private:
int a = 0;
};
一开始,所有的方法都在.h文件中。然后我使用了VS的重构功能,将所有这些方法都移到了.cpp文件中(它为我节省了很多劳动力。)
所有自动移动的方法前面都有一个内联关键字,
inline A::A()
{
cout << "A constructor\n";
}
我知道内联关键字,所以我认为没关系。
然后我在第三个源文件(.cpp文件)中使用了这个类。
void test()
{
std::unique_ptr< A> a = std::make_unique<A>();
}
当我编译项目时,它给了我一个错误 LNK2019 发生在 make_unique 中。
然后我删除了所有的 inline 关键字,它起作用了。 我不知道为什么当类的构造函数是内联时 make_unique 不起作用。
【问题讨论】:
-
inline函数必须在它们使用的每个源文件中定义(而不仅仅是声明)。该关键字旨在应用于标题中定义的函数。将它用于 .cpp 文件中定义的函数是没有意义的。 -
@NikitaKniazev,我认为这是一个 unique_ptr 问题。我刚刚测试过,这是一个移动内联函数到.cpp文件的问题。
标签: c++11 smart-pointers