Страницы

Поиск по вопросам

вторник, 7 января 2020 г.

Объявление шаблонного класса

#cpp #шаблоны_с++


Есть класс:
template 
class cFunction {
public:
    cFunction(T* _func, int _n);
    float getY(int num);
private:
    T* func;
};

и есть класс:
class cFunction1 {
public:
    cFunction1(float _a, float _b, float _x);
    cFunction1();
    void setParams(float _a, float _b, float _x);
    float getY();
private:
    float a, b, x;
};

который может передаваться в качестве параметра для класса cFunction.
Как объявить объект класса cFunction с параметром cFunction1?
Такая конструкция:
cFunction  *func = new cFunction(f1, size);

выдает ошибки:
undefined reference to `cFunction::cFunction(cFunction1*, int)'
collect2: ld returned 1 exit status
    


Ответы

Ответ 1



Хм. Шаблоны в C++, в отличие от, например, .NET, -- конструкция времени компиляции. То есть, во время выполнения программы шаблонов не существует, существуют только конкретные специализации. А теперь подумайте: если реализация вашего шаблонного класса в .cpp, откуда компилятор узнает, что нужно скомпилировать специализацию для шаблонного параметра cFunction1? Никак: когда он компилирует .cpp-файл с шаблоном, он не знает, какие специализации нужны, а когда он компилирует место, где заказывается специализация, у него нету исходников шаблона. Решение -- вынесите весь шаблонный класс в .h. Обратите внимание, что весь, к примеру, STL написан по этому принципу: реализация находится в header'е.

Ответ 2



Компиляторы очень не любят, когда объявление шаблона идет в хедере, а реализация - в cpp-файле. Вот тогда и возникает ошибка линковки. Нужно реализацию в хедере оставлять.

Комментариев нет:

Отправить комментарий