Почему я не могу использовать значение плавающее в качестве шаблонного параметра?

Когда я пытаюсь использовать float как шаблонный параметр, компилятор кричит для этого кода, в то время как int хорошо работает.

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

#include<iostream>
using namespace std;

template <class T, T defaultValue>
class GenericClass
{
private:
    T value;
public:
    GenericClass()
    {
        value = defaultValue;
    }

    T returnVal()
    {
        return value;
    }
}; 


int main()
{
    GenericClass <int, 10> gcInteger;
    GenericClass < float, 4.6f> gcFlaot;

    cout << "\n sum of integer is "<<gcInteger.returnVal();
    cout << "\n sum of float is "<<gcFlaot.returnVal();

    return 0;       
}

Ошибка:

main.cpp: In function `int main()':
main.cpp:25: error: `float' is not a valid type for a template constant parameter
main.cpp:25: error: invalid type in declaration before ';' token

main.cpp:28: error: request for member `returnVal' in `gcFlaot',
                    which is of non-class type `int'

Я читаю "Структуры данных для Игровых Программистов" Ron Penton, автор передает a float, но когда я пробую его, это, кажется, не компилирует.

107
задан Filip Roséen - refp 2 March 2014 в 11:53
поделиться

3 ответа

Текущий стандарт C++ не позволяет использовать float (т.е. вещественное число) или символьные строковые литералы в качестве шаблонных нетиповых параметров . Конечно, в качестве обычных аргументов можно использовать типы float и char *.

Возможно, автор использует компилятор, который не следует текущему стандарту?

34
ответ дан 24 November 2019 в 03:39
поделиться

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

То, что непреложный список получает по сравнению со стандартным списком JDK Collections.unmodifyList, заключается в том, что с помощью ImmutureList гарантируется, что объекты, на которые имеются ссылки, их порядок и размер списка не могут изменяться из какого-либо источника. С помощью Collections.unmodificalList, если что-то еще имеет ссылку на базовый список, этот код может изменить список, даже если у вас есть ссылка на неизменяемый список.

Если, однако, вы хотите истинной неизменяемости, вы должны заполнить список неизменяемыми объектами.

-121--1065014-

Выполните это в отдельном потоке или отправьте сообщение в очередь (может MSMQ ?), где другое приложение (может быть служба Windows) подписано на эту очередь и выполняет команды (например, «Delete e :\dir * .txt») в собственном процессе.

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

-121--2410568-

Просто укажите одну из причин, по которой это ограничение (по крайней мере, в текущем стандарте).

При сопоставлении специализаций шаблонов компилятор сопоставляет аргументы шаблона, включая аргументы, не относящиеся к типу.

По самой своей природе плавающие значения точки не являются точными, и их реализация не определена стандартом C++. В результате, трудно решить, когда два аргументов не типа с плавающей точкой действительно совпадают:

template <float f> void foo () ;

void bar () {
    foo< (1.0/3.0) > ();
    foo< (7.0/21.0) > ();
}

Эти выражения не обязательно производят один и тот же «битовый образец» и поэтому невозможно гарантировать, что они использовали одну и ту же специализацию - без специальной формулировки, чтобы охватить это.

31
ответ дан 24 November 2019 в 03:39
поделиться

действительно, вы не можете использовать поплавковые литералы как параметры шаблона. См. Раздел Раздел 14.1 («Шаблон не тип типа должен иметь одно из следующих (необязательно CV-квалифицированных) типов ...») стандарта.

Вы можете использовать ссылку на Float в качестве параметра шаблона:

template <class T, T const &defaultValue>
class GenericClass

.
.

float const c_four_point_six = 4.6; // at global scope

.
.

GenericClass < float, c_four_point_six> gcFlaot;
18
ответ дан 24 November 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: