Неопределенные ссылки на функции с помощью шаблонных методов C ++ - PullRequest
3 голосов
/ 24 июня 2010

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

class MathHelper
{
public:
    /*!
        Represents the ratio of the circumference of a circle to its diameter,
        specified by the constant, p. This value is accurate to 5 decimal places.
     */
    static const double pi = 3.14159;

    template <typename T> static const T modulo(const T &numerator, const T &denominator);
    static const double modulo(double numerator, double denominator);
    static const float modulo(float numerator, float denominator);
    template <typename T> static const T& clamp(const T &value, const T &min, const T &max);
    template <typename T> static const T wrap(const T &value, const T &min, const T &max);
    template <typename T> static bool isPowerOfTwo(T number);
    template <typename T> static T nearestPowerOfTwo(T number);
    static float aspectRatio(const QSize &size);
    template <typename T> static float aspectRatio(T width, T height);
    template <typename T> static T degreesToRadians(T degrees);
    template <typename T> static T radiansToDegrees(T radians);
    template <typename T> static T factorial(T n);

private:
    MathHelper() { }
};

Ответы [ 2 ]

2 голосов
/ 24 июня 2010

Я думаю, что объяснение и ответ на ваш вопрос таков: C ++ faq lite answer и следующие

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

my2c

0 голосов
/ 24 июня 2010

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

Пример: - В случаеMathHelper, если его нужно создать с помощью int, добавьте оператор template MathHelper<int> в соответствующий файл .cpp, где присутствует реализация.

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

Но мы получаем все преимущества отделения реализации от объявления, особенно когда размеры сборки огромны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...