如何实现从模板化类派生的类

How to implement class derived from templated class

提问人:Pasha 提问时间:11/28/2021 最后编辑:Pasha 更新时间:11/30/2021 访问量:82

问:

我有 2 个项目的解决方案。在第一个构建为库的项目中,我有模板化类

#pragma once

#include <memory>

template<class MessageType, class HandlerType>
class A
{
    std::unique_ptr<MessageType> msg;
    std::unique_ptr<HandlerType> handler;
public:
    A() : msg(std::make_unique<MessageType>()), handler(std::make_unique<HandlerType>()) {}
    virtual ~A() {}
};

然后是派生类

B.H.(英语:B.H)

#include "a.h"
#include <string>

struct MyMessage
{};
struct MyHandler
{};
class B : A<MyMessage, MyHandler>
{
    std::string name;
public:
    B(const std::string& str);
    virtual ~B();
};

并实施它

b.cpp

#include "b.h"

B::B(const std::string& str)
{
}

B::~B()
{}

此代码生成为静态库 (.lib)。但是当我尝试在主项目中使用 B 类的实例时:

进程.cpp

#include <iostream>
#include "b.h"

int main()
{
    std::cout << "Hello World!\n";
    B opa("yes");
}

编译器无法链接它

Rebuild started...
1>------ Rebuild All started: Project: ConsoleApplication3, Configuration: Debug Win32 ------
1>b.cpp
1>ConsoleApplication3.cpp
1>Generating Code...
1>ConsoleApplication3.vcxproj -> C:\Users\user\source\repos\tmpClass\Debug\ConsoleApplication3.lib
2>------ Rebuild All started: Project: tmpClass, Configuration: Debug Win32 ------
2>process.cpp
2>process.obj : error LNK2019: unresolved external symbol "public: __thiscall B::B(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0B@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function _main
2>process.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall B::~B(void)" (??1B@@UAE@XZ) referenced in function _main
2>C:\Users\user\source\repos\tmpClass\Debug\tmpClass.exe : fatal error LNK1120: 2 unresolved externals
2>Done building project "tmpClass.vcxproj" -- FAILED.
========== Rebuild All: 1 succeeded, 1 failed, 0 skipped ==========
C++ Visual-Studio 模板 链接器错误

评论

1赞 Pete Becker 11/28/2021
看起来这里的问题只在于如何编译多个文件;模板与问题无关。显然,有一个名为 被编译为生成 的文件,并且您显示的输出中没有提到或。你以前是否成功编写过涉及多个源文件的项目?(注意:不要在任何地方;这不是正确的解决方案)process.cppprocess.objb.cppb.obj#include "b.cpp"
0赞 Pasha 11/28/2021
我只是展示示例,因为我无法附加整个项目。但是,如果我在没有 b.cpp 的情况下在标头类中实现 B 类,那么一切都很好。
0赞 Igor Tandetnik 11/28/2021
您尚未添加到您的项目中。它没有被编译,或者至少没有被链接。b.cpp
0赞 Pete Becker 11/28/2021
您需要提供更多详细信息。您的项目由(至少)两个源文件和 .错误消息看起来像是在说只有一个被链接了。如果这是正确的,那么问题出在项目的设置中,而不是在代码中。process.cppb.cpp
0赞 Pasha 11/28/2021
它存在并被编译。a.h、b.h 和 b.cpp 存在于解决方案中的单独项目中,并编译为库。但是在进程.cpp中,我使用该B类。

答:

0赞 Minxin Yu - MSFT 11/30/2021 #1

LNK2019表示未添加相应的 lib 文件。您需要在 Properties>Linker>General>Additional Library Directory 中添加 Lib 文件目录,并在 Properties>Linker>Input>Additional Dependencies 中添加 Lib 文件。 请参考文档:在应用程序中使用静态库中的功能