template<int I>void fun(const char (&ar)[I]);
вызвать можно и так
fun("asdasdsa");
1.
template<char *>void fun();
//вызывать как fun("asdasdas") нельзя, так как этот литерал имеет внутр. компоновку.
потому работает такое
char ar[] = "asdasdasda";
void g(){
fun<ar>();
}
Of course, the code must be complete enough to compile and link.
Здравствуйте, limax, Вы писали:
L>Как можно (можно ли вообще?) указать строковой литерал в качестве параметра шаблона?
В качестве параметра шаблона могут выступать указатели на данные с внешней линковкой. Строковые литералы имеют видимость static (внутри модуля), поэтому такой фокус не пройдет.
Что делать:
— объявить глобальную переменную типа const char [] или const char* const
— отказаться от параметризации строкой
Здравствуйте, limax, Вы писали:
L>Как можно (можно ли вообще?) указать строковой литерал в качестве параметра шаблона?
L>
L>template<char txt[]> const char* textproxy()
L> { return txt; }
L>//template<const char *txt> const char* textproxy(); //работает аналогично
L>char testing3[]="testing3";
L>void test()
L> {
L> //textproxy<"testing1">(); //не компилируется: "неверный параметр" (?!?)
L> static char testing2[]="testing2";
L> //textproxy<testing2>(); //не компилируется: "локальная переменная в качестве параметра", хоть и статическая.
L> textproxy<testing3>(); //работает, но на кой нам это надо?
L> }
L>
Стандартом не допускается использование строки в качестве аргумента шаблона, так как сторка является объектом с внутреней линковкой (internal linkage).
поэтому
Однажды стояла такая же проблема, но потом она разрешилась сама собой.
Все строки обычно помещают в ресурсы, и т.о. в шаблон передается не сама строка, а ее ID в ресурсах.