【问题标题】:Why doesn't make_unique work with a class which has an inline constructor? [duplicate]为什么 make_unique 不能与具有内联构造函数的类一起使用? [复制]
【发布时间】: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


【解决方案1】:

我认为这是一个 unique_ptr 问题。我刚刚测试过,这是一个移动内联函数到.cpp文件的问题。

在 .cpp 文件中使用内联构造函数。仅仅创建一个 A 类实例会失败。

A a;

严重性代码描述项目文件行抑制状态 错误 LNK2019 未解析的外部符号“public: __thiscall __AWellDefinedClass::A::A(void)" (??0A@__AWellDefinedClass@@QAE@XZ) 在函数“void __cdecl __pointerTest::test(void)”中引用 (?test@__pointerTest@@YAXXZ) ForTest D:\test\ForTest\ForTest\pointerTest.obj 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 2017-04-07
    • 1970-01-01
    • 2014-05-01
    • 2015-11-02
    • 2016-04-05
    • 2012-11-28
    相关资源
    最近更新 更多