C++ 未定义对对象的引用 [重复]

C++ undefined reference to object [duplicate]

提问人:mahn00b 提问时间:9/27/2016 更新时间:9/27/2016 访问量:864

问:

我正在开发一个简单的 c++ 项目来实现一个堆类并使用它的函数。我已经写出了大部分代码,当我去尝试一些功能时,控制台会告诉我,当我尝试编译时,我有未引用的符号。下面是代码。

堆.h:

#ifndef HEAP_H
#define HEAP_H




template<typename T>
class Heap {

  T arr[100];
  int heapSize;

  //int parent(int);//returnts the index of the parent
  int leftChild(int);//returns the index of the left child
  int rightChild(int);//returns the index of the right child
  void heapify(T*,int);//made to build the heap;
  void buildHeap();//constructs the heap

public:
  Heap();//default constructor
  Heap(T[], int);//custom constructer accepts an array of type T and size
  ~Heap();//destructor
  void insert(T);//insert a node into the array
 // void heapSort(T*);
  T extractMax (); //return root value and remove it from heap
  T maximum();//return the maximum
  void printHeap();//print the values of the heap


};




#endif

堆.cpp :

#include "Heap.h"
#include <iostream>


template<typename T>
Heap<T>::Heap() { heapSize = 0; }

template<typename T>
Heap<T>::Heap(T a[], int size) {//accepts an array of Type T

  for(int i =0; i < size; i++)
    arr[i] = a[i];

  heapSize = size;

  buildHeap();

}

template<typename T>
Heap<T>::~Heap() { }


template<typename T>
int Heap<T>::leftChild(int i) { return ((i*2) + 1); } //the left child is given by index*2 +1 




template<typename T>
int Heap<T>::rightChild(int i) { return ((i*2) + 2); } //the right child is given by index*2 +2 



template<typename T>
void Heap<T>::heapify(T* a, int i )
{

  int left, right, largest;
  T temp;

  left = leftChild(i);//get the index for the left child
  right = rightChild(i);//get the index for the right child



  if((left <= heapSize) && a[left] > a[i])//check which index has the largest value and store it
    //also checks if the  index is within the heap size
    largest = left;
  else
    largest = i;

  if((right <= heapSize) && a[right] > a[largest])//check if right child is larger
    largest = right;


  if(largest != i)//swap the values of the child is larger than parent
  {
    temp = a[i];
    a[i] = a[largest];
    a[largest] = temp;

    heapify(a, largest);

  }


}

template<typename T>
void Heap<T>::buildHeap()
{
  int hSize = heapSize;//takes the size of the heap

  for(int i = ((hSize/2)-1); i >= 0 ; i--)//loops through every node to make sure they are sorted
    heapify(arr, i);

}


template<typename T>
T Heap<T>::maximum() { return arr[0]; } //return the first element or root element;

template<typename T>
T Heap<T>::extractMax() //removes the root element and returns it
{
  T max = arr[0];
  T* temp = new T[heapSize-1];//create a temp array

  for(int i = 0; i < heapSize; i++)//store all old vals to temp arr except for first element;
    temp[i] = arr[i+1];

  arr = temp;//set arr to temp array
  heapSize--;//decerease heapsize
  buildHeap(); //rebuild heap

  return max; //return root value;

}



template<typename T>
void Heap<T>::insert(T add) //add is the new element for the heap
{

  arr[heapSize] = add;//add the new element to the end of the arr
  heapSize++;//increase heapsize

  buildHeap(arr, heapSize);//call buildHeap to rebuild and resort the heap with the new element


}


template<typename T>
void Heap<T>::printHeap()
{

  for(int i =0; i < heapSize; i++)
    std::cout<<arr[i];

}

Main.cpp:

#include "Heap.h"
#include <iostream>




using namespace std;




int main() 
{


  int arr[] = {6,7,9,10,2,4,5};

  Heap<int> heap(arr, 7);
  heap.printHeap();



 return 0; 
}

我的makefile:

all: heapmake




heapmake: Main.o Heap.o
    g++  Main.o Heap.o -o heapmake

Main.o:Main.cpp
    g++ -c Main.cpp

Heap.o:Heap.cpp
    g++ -c Heap.cpp

clean:
    rm *o heapmake

我怀疑我没有正确地将文件链接在一起,但我想我会发布所有代码以防万一。

C++ 头文件 未定义引用

评论


答:

0赞 krzaq 9/27/2016 #1

模板需要在实例化时显示其定义,因此将它们放入文件中(几乎)是不可能的。.cpp

将定义移动到标题(可以是标题,也可以是新标题,称为 )。你也可以把你的主文件放进去(以及其他任何地方,只要有需要它),但包括一个文件是一个有争议的决定,有争议的替代方案要少得多。Heap.hHeapImpl.h#include "Heap.cpp".cpp

另一种选择是抢先实例化您希望在 中支持的所有类型,它看起来像这样:HeapHeap.cpp

template class Heap<int>;
template class Heap<double>;
// etc