当我尝试使用模板扩充 class 时出现链接错误 (LINK 2019)
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
};
对于 class 定义和作为:
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());
}
对于 main 函数中使用的构造函数之一。
我收到两个链接错误:
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) 在函数 _main 中引用
主要功能是:
{
heapt<int> hh{ 27,12,3,13,2,4,14,5 };
std::cout << "Hello" << '\n';
hh.print_heapt();
}
编辑: heapt
class 在 "heap.h" 文件中,构造函数 heapt<Elem>::heapt(std::initializer_list<Elem> lst)
的定义在"heap.cpp" class,其中包含 #include"heap.h"
作为头文件。 int main
函数位于名为 "InSo.cpp" 的文件中,该文件还具有 #include"heap.h"
作为头文件。
在您的模板化 class 声明中,您使用的是 heapt(std::initializer_list<double> lst);
,但在您的定义中,您使用的是 std::initializer_list<Elem>
。您应该将声明更改为 heapt(std::initializer_list<Elem> lst);
您仍然缺少 print_heapt 和 build_heapt 的定义,但除此之外应该可以编译。
编辑:鉴于您阐明了源文件的设置方式,请参阅 WhozCraig 对您初始 post 的评论。例如,您可以在 heap.hpp
文件中包含模板化 class 函数的定义,并将其包含在 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
我正在尝试构建一个简单的堆数据结构来练习。当我为 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
};
对于 class 定义和作为:
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());
}
对于 main 函数中使用的构造函数之一。
我收到两个链接错误:
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) 在函数 _main 中引用
主要功能是:
{
heapt<int> hh{ 27,12,3,13,2,4,14,5 };
std::cout << "Hello" << '\n';
hh.print_heapt();
}
编辑: heapt
class 在 "heap.h" 文件中,构造函数 heapt<Elem>::heapt(std::initializer_list<Elem> lst)
的定义在"heap.cpp" class,其中包含 #include"heap.h"
作为头文件。 int main
函数位于名为 "InSo.cpp" 的文件中,该文件还具有 #include"heap.h"
作为头文件。
在您的模板化 class 声明中,您使用的是 heapt(std::initializer_list<double> lst);
,但在您的定义中,您使用的是 std::initializer_list<Elem>
。您应该将声明更改为 heapt(std::initializer_list<Elem> lst);
您仍然缺少 print_heapt 和 build_heapt 的定义,但除此之外应该可以编译。
编辑:鉴于您阐明了源文件的设置方式,请参阅 WhozCraig 对您初始 post 的评论。例如,您可以在 heap.hpp
文件中包含模板化 class 函数的定义,并将其包含在 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