Я удивлен, что не нашел здесь ответа на мой вопрос.Если я пропустил это, не стесняйтесь указывать на меня.
Редактировать: я получил уведомление, что это может быть возможной копией Почему шаблоны могут быть реализованы только в заголовочном файле? Хотя этосодержит много полезной информации о том, как классы обрабатывают шаблонные классы компилятором. Я до сих пор не нашел информации о том, как обрабатывать статические константы, необходимые классу, которые фактически нужны только один раз для всех возможных реализаций шаблона.
Мой вариант использования - шаблонный класс преобразования числа с плавающей точкой в строку.Одна функция-член должна быть функцией, которая создает числа с добавлением si-префиксов.Поэтому необходим некоторый массив поиска с префиксными символами - этот массив не имеет отношения к тому, какой шаблонный тип с плавающей запятой фактически выбран.Я сделал что-то вроде этого:
// Float2String.h
#include <string>
template <typename FloatType>
class Float2String
{
public:
//...
static std::string withSIPrefix (FloatType floatNumber, int numSignificantDigits)
{
// scale the number, convert it to a string and compute the idx to pick the right prefix...
return floatNumberScaledAndConvertedToString + siPrefixes[idx];
}
private:
static constexpr char[11][3] siPrefixes = {"f", "p", "n", "μ", "m", "", "k", "M", "G", "T", "P"};
};
// Float2String.cpp
#include "Float2String.h"
template <typename FloatType>
constexpr char Float2String<FloatType>::siPrefixes[11][3];
При попытке использовать его, например, для преобразования двойного числа, я получаю следующую ошибку компоновщика:
Error:Undefined symbol 'Float2String<double>::siPrefixes' referenced from:
Error: Float2String<double>::withSIPrefix(double, int) in Main.o
Я в Mac OSс Clang и скомпилировать с включенным C ++ 14.
Вопросы: Как мне сделать это правильно?А может быть, это можно сделать лучше с другим подходом?