#cpp #шаблоны_с++
Есть класс: templateclass 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-файле. Вот тогда и возникает ошибка линковки. Нужно реализацию в хедере оставлять.
Комментариев нет:
Отправить комментарий