2 Stimmen

c++ Klasse mit Vorlagen Kompilierungsfehler

Ich bin kein erfahrener C++-Programmierer und habe Probleme beim Kompilieren. Ich habe eine Heap-Klasse, die eine Vorlage verwendet:

template <class T>
class Heap
{
  public:
    Heap(const vector<T>& values);

  private:
    vector<T> d;

  // etc.
};

Und dann in einer separaten Implementierungsdatei:

template <class T>
Heap<T>::Heap(const vector<T>& values)
{
d = values;

for (unsigned int i = d.size()-1; i > 0; i--) Heapify(ParentIndex(i));
}

// ... more implementation code ...

Und schließlich eine Datei main.cc:

int main (int argc, char *argv[])
{
  vector<int> in;
  unsigned int i;

  while (cin >> i) in.push_back(i);
  Heap<int> h = Heap<int>(in);

  return 0;
} 

Ich erhalte diese Kompilierfehler:

g++ -Wall -I/opt/local/include -c -o main.o main.cc
g++ -Wall -I/opt/local/include -c -o heap.o heap.cc
g++ -Wall -o heap main.o heap.o
Undefined symbols:
  "Heap<int>::Heap(std::vector<int, std::allocator<int> > const&)", referenced from:
      _main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [heap] Error 1

Warum lässt sich das nicht kompilieren? Ich denke, der Linker sagt, dass er den Konstruktor nicht finden kann, aber ich weiß, dass er die Objektdatei erstellt hat.

8voto

JaredPar Punkte 699699

Schablonen müssen zu 100 % in der Header-Datei definiert werden. Wenn Sie Ihre Heap<T> Implementierung in einer .cc / .cpp-Datei, die das Problem darstellt. Verschieben Sie den gesamten Code in die Header-Datei und es sollte Ihr Problem beheben.

3voto

Cogwheel Punkte 21865

Gemäß dem C++-Standard können Sie die export Stichwort also:

export template<typename foo>...

Die meisten Compiler unterstützen dies jedoch nicht. Die C++-FAQ enthält einige weitere Informationen: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.14

In der Antwort von JaredPar finden Sie etwas, das tatsächlich zuverlässig ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X