首页 > 解决方案 > 析构函数和“工厂”方法的 LNK2019 错误

问题描述

我在析构函数和返回类的 unique_ptr 的静态“工厂”方法上收到未解决的外部符号错误(LNK2019,考虑到当前年份,这似乎是及时的)(请参见下面的代码)。

#ifndef ABC_HPP
#define ABC_HPP

#include <memory>

enum SomeEnum { TYPE_A, TYPE_B };

template <SomeEnum Type>
class ABC
{
//------------------------------------------------------------------------------ Constructor / Destructor
private:

    ABC();

    /* Inaccessible Methods */
    ABC(ABC&&)                  = delete;
    ABC(const ABC&)             = delete;
    ABC& operator=(ABC&&)       = delete;
    ABC& operator=(const ABC&)  = delete;

public:
    ~ABC();

//------------------------------------------------------------------------------ Factory Method
public:

    static std::unique_ptr<ABC<Type>> Create();

//------------------------------------------------------------------------------
};

#endif /* ABC_HPP */


下面是上述类的实现:

#include "ABC.hpp"

//------------------------------------------------------------------------------ Constructor(s)

template <SomeEnum Type>
ABC<Type>::ABC() {}

//------------------------------------------------------------------------------ Destructor

template <SomeEnum Type>
ABC<Type>::~ABC() {}

//------------------------------------------------------------------------------ Create

template <SomeEnum Type>
std::unique_ptr<ABC<Type>> ABC<Type>::Create()
{
    return std::make_unique<ABC<Type>>();
}

//------------------------------------------------------------------------------


一切都编译得很好......直到我这样做:

#include "ABC.hpp"

int main(int argc, char* argv[])
{
    auto thingA = ABC<TYPE_A>::Create();

    return 0;
}

我最初尝试在 Visual Studio 上编译它,但我也尝试过 clang 并得到了同样的错误。

我在这里到底做错了什么?我觉得我以前遇到过这个错误,但我太笨了,不记得问题出在哪里。

如果我使用原始指针,我可以摆脱析构函数错误,但我想在这里使用 unique_ptr。我也可以通过简单地完全注释掉析构函数来摆脱它,但这对我来说也不酷。另一种方法是在头文件中定义析构函数,但这很愚蠢;我应该能够分离实现。

到目前为止,我还没有找到让 Create 方法工作的方法。我只是想在这里做太多吗?我真的必须做一个工厂课程吗?我是不是太爱做梦了?这个问题是不是太长???

提前感谢任何回复的人。:)

标签: c++

解决方案


推荐阅读