当我试图用模板扩充类时,我遇到了一个链接错误(LINK2019)
I get a linking error (LINK 2019) when I try to augment a class with template
我正在尝试构建一个简单的堆数据结构以供实践。当我为double
构建版本时,它运行良好。
class heapt {
public:
heapt();
heapt(std::initializer_list<double> lst);
void print_heapt();
private:
int size;
int length;
double* elem; //points to root
};
它的构造函数工作得很好,堆也按它应该的方式打印。但当我试图用来概括它时
template< typename Elem>
作为:
template<typename Elem>
class heapt {
public:
heapt();
heapt(std::initializer_list<Elem> lst);
void print_heapt();
private:
int size;
int length;
Elem* elem; //points to root
};
对于类定义和作为:
template<typename Elem>
heapt<Elem>::heapt(std::initializer_list<Elem> lst) :
size{ static_cast<int>(lst.size()) },
elem{new Elem[lst.size()]}
{
std::copy(lst.begin(), lst.end(), elem);//Now heaptify elem
build_heapt(elem, lst.size());
}
用于主函数中使用的构造函数之一。
我得到两个链接错误:
LNK2019未解析的外部符号"public:void __thiscall heapt::print_heapt(void("(?print_heapt@$heapt@H@@QAEXXZ(在函数_main 中引用
LNK2019未解析的外部符号"public:__thiscall heapt::heapt(class std::initializer_list("(??0$heapt@H@@QAE@V$initializer_list@H@std@@@Z(
主要功能是:
{
heapt<int> hh{ 27,12,3,13,2,4,14,5 };
std::cout << "Hello" << 'n';
hh.print_heapt();
}
EDIT:heapt
类在"heap.h"文件中,构造函数heapt<Elem>::heapt(std::initializer_list<Elem> lst)
的定义在"heap.comp"类中,该类将#include"heap.h"
作为头文件。int main
函数位于名为"InSo.cpp"的文件中,该文件还将#include"heap.h"
作为头文件。
在模板化类声明中,您使用的是heapt(std::initializer_list<double> lst);
,但在定义中,您正在使用std::initializer_list<Elem>
。您应该将声明更改为heapt(std::initializer_list<Elem> lst);
您仍然缺少print_heapt和build_heapt的定义,但除此之外它应该编译。
编辑:鉴于你澄清了你的源文件是如何设置的,请参阅WhozCraig对你最初帖子的评论。例如,您可以在heap.hpp
文件中包含模板化类函数的定义,并将其包含在heap.h
的末尾,也可以将它们全部放在一个文件中,例如
// heap.h
#ifndef HEAP_H
#define HEAP_H
#include <initializer_list>
template<typename Elem>
class heapt {
public:
heapt();
heapt(std::initializer_list<Elem> lst);
void print_heapt();
private:
int size;
int length;
Elem* elem; //points to root
};
#include "heap.hpp"
#endif
//heap.hpp
#ifndef HEAP_HPP
#define HEAP_HPP
#include "heap.h"
#include <algorithm>
template<typename Elem>
heapt<Elem>::heapt(std::initializer_list<Elem> lst) :
size{ static_cast<int>(lst.size()) },
elem{ new Elem[lst.size()] }
{
std::copy(lst.begin(), lst.end(), elem);//Now heaptify elem
//build_heapt(elem, lst.size());
}
#endif
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '