C ++ класс с ошибкой компиляции шаблонов - PullRequest
2 голосов
/ 27 октября 2009

Я не опытный программист на C ++, и у меня проблемы с компиляцией. У меня есть класс кучи, который использует шаблон:

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

  private:
    vector<T> d;

  // etc.
};

А затем в отдельном файле реализации:

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 ...

И, наконец, файл 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;
} 

Я получаю следующие ошибки компиляции:

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

Почему это не компилируется? Я думаю, что компоновщик говорит, что не может найти конструктор, но я знаю, что он создал объектный файл.

Ответы [ 2 ]

8 голосов
/ 27 октября 2009

Шаблоны должны быть определены на 100% в заголовочном файле. Если у вас есть реализация Heap<T> в файле .cc / .cpp, то это проблема. Переместите весь код в заголовочный файл, и это должно исправить вашу проблему.

3 голосов
/ 27 октября 2009

Согласно стандарту C ++, вы можете использовать ключевое слово export следующим образом:

export template<typename foo>...

Однако большинство компиляторов не поддерживают это. В C ++ FAQ есть немного больше информации: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.14

См. Ответ JaredPar о чем-то действительно надежном.

...