c++ - 尝试使用模板扩展类时出现链接错误(LINK 2019)

标签 c++ visual-studio compiler-errors linker lnk2019

我正在尝试构建一个简单的堆数据结构以进行练习。当我为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());
}

用于main函数中的构造函数之一。

我收到两个链接错误:

LNK2019不可解析的外部符号“public:void __thiscall heapt::print_heapt(void)”(?print_heapt @?$ heapt @ H @@ QAEXXZ)

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类在“heap.h”文件中,构造函数heapt<Elem>::heapt(std::initializer_list<Elem> lst)的定义在“heap.cpp”类中,该类具有#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

关于c++ - 尝试使用模板扩展类时出现链接错误(LINK 2019),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61678608/

相关文章:

visual-studio-2010 - 如何按用户搜索变更集

c - 如何解决 Visual Studio 2005 中的错误 C2664 _vswprintf_c_l 错误?

c++ - 将 State 的输入转换为缩写

visual-studio - 用于分析的自定义 prolog/epilog 函数

C++ Windows 二进制文件 : conditions to be used with MinGW

visual-studio-2010 - 在项目模板中使用 IWizard 而不在 GAC 中安装程序集?

python - 我的代码正在使用递归产生逻辑错误,但我不知道如何解决它

c++ - MSVC++ 编译器错误 C2143

c++ - 如何在主题中定位切换按钮

c++ - 如何让 Visual Studio 2010 警告未使用的变量?