Когда я пытаюсь использовать 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
, но когда я пробую его, это, кажется, не компилирует.
Текущий стандарт C++ не позволяет использовать float
(т.е. вещественное число) или символьные строковые литералы в качестве шаблонных нетиповых параметров . Конечно, в качестве обычных аргументов можно использовать типы float
и char *
.
Возможно, автор использует компилятор, который не следует текущему стандарту?
Нет, неизменяемость применяется только к количеству и ссылкам объектов в коллекции и не затрагивает изменяемость объектов, помещенных в коллекцию.
То, что непреложный список получает по сравнению со стандартным списком 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) > ();
}
Эти выражения не обязательно производят один и тот же «битовый образец» и поэтому невозможно гарантировать, что они использовали одну и ту же специализацию - без специальной формулировки, чтобы охватить это.
действительно, вы не можете использовать поплавковые литералы как параметры шаблона. См. Раздел Раздел 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;