Инициализировать статический член constexpr в шаблонном классе - PullRequest
0 голосов
/ 25 сентября 2018

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

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

Мой вариант использования - шаблонный класс преобразования числа с плавающей точкой в ​​строку.Одна функция-член должна быть функцией, которая создает числа с добавлением 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.

Вопросы: Как мне сделать это правильно?А может быть, это можно сделать лучше с другим подходом?

1 Ответ

0 голосов
/ 25 сентября 2018

Возможно, вы можете определить свои siPrefixes вне шаблона calss.Он не зависит от типа вашего шаблона.

Вы можете определить его непосредственно в вашем файле cpp и переместить метод с помощью реализации SIPrefix в ваш файл cpp.

...