c++ - 试图继承 STL 集时出现链接错误

标签 c++ templates stl

我正在尝试编写 STL 的派生类 set<>并发生链接错误。

头文件Set.h :

#pragma once
#include <set>
using namespace std;

template <class Ty>
class Set : public set<Ty> {
public:
    Set(void);
    virtual ~Set(void);
};

辅助源文件Set.cpp :

#include "Set.h"
template <class Ty>
Set<Ty>::Set(void) {}
template <class Ty>
Set<Ty>::~Set(void) {}  

主程序:

#include <iostream>
#include "../myLibrary/Set.h"
#pragma comment(lib, "../x64/Debug/myLibrary.lib")

using namespace std;
int main() {
    Set<int> s;
    s.insert(1); s.insert(2); s.insert(3);
    for(Set<int>::const_iterator it = s.begin(); it!=s.end(); it++)
        wcout << *it << endl;
    return 0;
}

这提高了

Set.obj : *warning* LNK4221:

_Entry_myLibrary_TEST.obj :error LNK2019: "public: virtual __cdecl Set<int>::~Set<int>(void)" (??1?$Set@H@@UEAA@XZ)

最佳答案

您的直接问题是将模板函数放入 Set.cpp 中。 模板函数需要对使用它们的代码可见,因此它们需要位于 .h 文件中而不是单独的 .cpp 文件中。

辅助源文件Set.cpp:

#include "Set.h" 
template <class Ty> 
Set<Ty>::Set(void) {} 

template <class Ty> 
Set<Ty>::~Set(void) {} 

将函数放在标题中,它们需要在使用它们的地方可见。

我会留给其他人指出为什么从 set 继承可能不是你想要做的,因为这不是你的问题。

关于c++ - 试图继承 STL 集时出现链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11875722/

相关文章:

c++ - 如何在 Linux 上强制执行 vector 下标超出范围调试断言

c++ - 重载 << 导致 valgrind 错误

c++ - 函数模板的模板参数名是否可以在函数参数列表中多次使用?

c++ - 模板类构造函数接受参数时出错

c++ - 为用户定义类型的 shared_ptr 专门化标准库函数是否合法?

c++ - 为容器生成成员类型

c++ - 如何检查 std::vector 超出范围的访问

c++ - 在类中调用类

c++ - STL 类头中的多个定义

c++ - 对象 std::shared_ptr 是否可以通过它的 std::weak_ptr 找到?