Почему функция не определена в файле .o для этого класса C ++? - PullRequest
3 голосов
/ 09 ноября 2010

У меня есть класс C ++, который я использую, и в нем есть функция, которая не отображается, когда я смотрю на файл .o с помощью «nm --demangle», и функция отсутствует, когда программа пытается запустить, даже если все работает нормально.

Заголовок выглядит так:

#ifndef __COLLECTION_H
#define __COLLECTION_H

#include <vector>

#include "ObjectInstance.h"

using namespace std;

template <class T>
class Collection : public ObjectInstance
{       
protected:
    vector<T*> items;
    void internalInsertAt(T* item, int index);
    void internalRemoveIndex(int index);
    void internalRemoveItem(T* item);

public:
    virtual ~Collection();
    // Specific functions for this interface
    static int item(jsplugin_obj *this_obj, jsplugin_obj *function_obj, int argc, 
    T* internalGetItem(int index);
    int getSize();
    void addItem(T* item);
};

#endif

и функция addItem реализована как

template <class T>
void Collection<T>::addItem(T* item)
{   
    items.push_back(item);
}   

Ошибка, которую я получаю, когда я пытаюсь унаследовать этот класс в другом и появляется во время выполнения: undefined symbol: _ZN10CollectionIN4NJSE5TrackEE7addItemEPS1_

Я чувствую, что упускаю что-то простое здесь, но не могу сказать, что это такое.

Ответы [ 4 ]

3 голосов
/ 09 ноября 2010

Ну, я думаю, это потому, что функция является членом шаблона. В C ++ вы не можете компилировать шаблоны (по крайней мере, не легко). Если вы хотите распространять шаблоны классов, напишите весь код в заголовке.

3 голосов
/ 09 ноября 2010

Функция находится в заголовочном файле или исходном файле?Самый простой способ работы с шаблонами - это поместить все определения шаблонов в заголовочные файлы, чтобы гарантировать, что определение доступно любому коду, в котором он создан.

2 голосов
/ 09 ноября 2010

Шаблоны в отдельных блоках компиляции могут быть кошмаром, и для них требуется серьезная работа компилятора.

Помните, что конкретные версии вашей функции шаблона должны быть скомпилированы для каждого типа T, для которого вы пытаетесь создать экземпляр шаблона для.

По этой причине самый простой способ - поместить все определения функций вашего шаблона в заголовочный файл .h.

2 голосов
/ 09 ноября 2010

Компилятор должен иметь доступ ко всему определению шаблона (а не только к сигнатуре), равному addItem, чтобы генерировать код для каждого экземпляра шаблона, поэтому вам нужно перенести его определение в заголовок, т.е. следовать модель включения .

Современные компиляторы C ++ Infact не легко поддерживают отдельную модель компиляции для шаблонов.

...