Господа, всем доброе время суток!
На следующую программку из двух строк VC++ 6.0 SP6
выругался следующим образом:
C2964 — invalid expression as template parameter
Так вот вопрос такой: это он зачем так ? И согласен ли
с ним Стандарт в этом случае ?
template<void *V> class T {};
T<(void *)1> t; // <- здесь
Здравствуйте, dik, Вы писали:
do> C2964 — invalid expression as template parameter do> Так вот вопрос такой: это он зачем так ? do> И согласен ли с ним Стандарт в этом случае ? do> template<void *V> class T {}; do> T<(void *)1> t; // <- здесь
Все верно: в качестве нетипового аргумента шаблона — указателя стандарт разрешает только
адреса объектов или функций с внешним связыванием. Вот полный перечень того, что может служить
в качестве нетиповых аргументов шаблонов:
14.3.2/1
A template-argument for a non-type, non-template template-parameter shall be one of:
— an integral constant-expression of integral or enumeration type; or
— the name of a non-type template-parameter; or
— the name of an object or function with external linkage, including function templates and function
template-ids but excluding non-static class members, expressed as id-expression; or
— the address of an object or function with external linkage, including function templates and function
template-ids but excluding non-static class members, expressed as & id-expression where the & is
optional if the name refers to a function or array; or
— a pointer to member expressed as described in 5.3.1.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
DOB>template<void *V> class T {};
DOB>T<(void *)1> t; // <- здесь
Если параметр шаблона имеет тип указателя или ссылки, то соответствующий аргумент должен быть указателем или ссылкой на объект, обладающий внешним связыванием.
Например:
template<void *V> class T {};
extern X x;
T<&x> t;
ПК>Все верно: в качестве нетипового аргумента шаблона — указателя стандарт разрешает только ПК>адреса объектов или функций с внешним связыванием. Вот полный перечень того, что может служить ПК>в качестве нетиповых аргументов шаблонов:
Спасибо.
Тогда, насколько я понимаю, код
template<void *V> class T {};
T<(void *)0> t;
тоже не является корректным. Хотя воспринимается вц++ 6
без вопросов
К>А так не пробовал? Может, это более осмысленно, чем передавать инвалидные указатели? К>
К>template<int n> class T {};
T<1>> t;
К>
Объясню смысл: пытаюсь завернуть виндовый HANDLE в шаблон, в
качестве одного из параметров которого должно участвовать
его неправильное значение (NULL или INVALID_HANDLE_VALUE).
Но на значении параметра INVALID_HANDLE_VALUE суть которого
(HANDLE *)-1 вц++ обломился в отличие от NULL
Здравствуйте, dik o-braz, Вы писали:
DOB>Объясню смысл: пытаюсь завернуть виндовый HANDLE в шаблон, в DOB>качестве одного из параметров которого должно участвовать DOB>его неправильное значение (NULL или INVALID_HANDLE_VALUE). DOB>Но на значении параметра INVALID_HANDLE_VALUE суть которого DOB>(HANDLE *)-1 вц++ обломился в отличие от NULL
Сомнительная затея. Все значения хэндлов, кроме NULL и INVALID_HANDLE_VALUE, не являются константами времени компиляции. Их раздает операционная система, более или менее произвольным образом.
Здравствуйте, dik, Вы писали:
ПК>> в качестве нетипового аргумента шаблона — указателя стандарт разрешает только ПК>> адреса объектов или функций с внешним связыванием.
do> Тогда, насколько я понимаю, код do> template<void *V> class T {}; do> T<(void *)0> t; do> тоже не является корректным.
Верно. GCC, например, говорит так:
test.cpp:2: `0' is not a valid template argument
test.cpp:2: it must be the address of an object with external linkage
и имеет право.
do> Хотя воспринимается вц++ 6 без вопросов
Короче, стоит задача обобщения представления
простых свойств WIN32-типа HANDLE, представляющего
различные объекты системы: файлы, события, мьютексы и т.п.
В простом варианте это обобщение собиралось выглядеть так:
К>Сомнительная затея. Все значения хэндлов, кроме NULL и INVALID_HANDLE_VALUE, не являются константами времени компиляции. Их раздает операционная система, более или менее произвольным образом.
Все это понятно. Мне как раз и нужны всего две константы
Здравствуйте, dik o-braz, Вы писали:
К>>Сомнительная затея. Все значения хэндлов, кроме NULL и INVALID_HANDLE_VALUE, не являются константами времени компиляции. Их раздает операционная система, более или менее произвольным образом.
DOB>Все это понятно. Мне как раз и нужны всего две константы
Запакуй их в структуру и передавай вторым параметром шаблона тип соответствующей структуры.
do> Но вот пока не срослось со вторым параметром ...
Это несложно поправить: насколько я вижу, у тебя нет никакой необходимости в том, чтобы параметр
Inv передавался именно так. Предлагаю сделать передавать его косвенно, посредством стратегией/policy.
Если есть желание, можно даже объединить оба аргумента в единую стратегию/policy:
template<class Policy>
class handle_t {
. . .
это позволит не быть привязанным к конкретному типу функции, освобождающей хэндл, достаточно будет,
что в структуре, задаваемой параметром Policy будет статическая функция close() принимающая в качестве
аргумента HANDLE.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
ПК>Это несложно поправить: насколько я вижу, у тебя нет никакой необходимости в том, чтобы параметр ПК>Inv передавался именно так.
Верно.
ПК>Предлагаю сделать передавать его косвенно, посредством стратегией/policy.
Видимо, так и придется сделать. Спасибо.
Думается, такое ограничение для параметров шаблона — указателей ввели для
того, чтобы уберечься от испоьзования его возможно неинициализированного
значения.
Здравствуйте, dik o-braz, Вы писали:
DOB>Видимо, так и придется сделать. Спасибо. DOB>Думается, такое ограничение для параметров шаблона — указателей ввели для DOB>того, чтобы уберечься от испоьзования его возможно неинициализированного DOB>значения.
Нет, для того, чтобы упростить работу сборщику — ведь получающиеся из шаблонов классы и функции нужно как-то идентифицировать.