【问题标题】:I get a linking error (LINK 2019) when I try to augment a class with template当我尝试使用模板扩充类时出现链接错误 (LINK 2019)
【发布时间】:2020-08-23 23:28:29
【问题描述】:

我正在尝试构建一个简单的堆数据结构以供练习。当我为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&lt; typename Elem&gt;

作为:

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
};

对于类定义和 as:

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 函数 _main 中引用的未解析外部符号“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&lt;Elem&gt;::heapt(std::initializer_list&lt;Elem&gt; lst) 的定义在“heap.cpp”类中,其中有#include"heap.h"作为头文件。 int main 函数位于名为“InSo.cpp”的文件中,该文件还具有 #include"heap.h" 作为头文件。

【问题讨论】:

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


【解决方案1】:

在您的模板类声明中,您使用的是heapt(std::initializer_list&lt;double&gt; lst);,但在您的定义中,您使用的是std::initializer_list&lt;Elem&gt;。您应该将声明更改为heapt(std::initializer_list&lt;Elem&gt; 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

【讨论】:

  • 很抱歉,我在写问题时输入错误。我正在尝试使用heapt(std::initializer_list&lt;Elem&gt; lst); 进行构建,并且遇到了问题中提到的相同错误。我也定义了 print_heapt 和 build_heapt,但我没有提到它们的定义,因为它们与我遇到的错误没有直接关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多