Параметр шаблона - строковой литерал.
От: limax Россия http://mem.ee
Дата: 05.08.03 14:07
Оценка:
Как можно (можно ли вообще?) указать строковой литерал в качестве параметра шаблона?

template<char txt[]> const char* textproxy()
    { return txt; }
//template<const char *txt> const char* textproxy(); //работает аналогично

char testing3[]="testing3";

void test()
    {
    //textproxy<"testing1">(); //не компилируется: "неверный параметр" (?!?)

    static char testing2[]="testing2";
    //textproxy<testing2>(); //не компилируется: "локальная переменная в качестве параметра", хоть и статическая.

    textproxy<testing3>(); //работает, но на кой нам это надо?
    }
Have fun: Win+M, Ctrl+A, Enter
Re: Параметр шаблона - строковой литерал.
От: MaximE Великобритания  
Дата: 05.08.03 14:14
Оценка:
Здравствуйте, limax, Вы писали:

L>Как можно (можно ли вообще?) указать строковой литерал в качестве параметра шаблона?


Никак.

Строковой литерал не имеет linkage, а параметром шаблона, в частности, может быть указатель только с external linkage.
Re: Параметр шаблона - строковой литерал.
От: Lorenzo_LAMAS  
Дата: 05.08.03 14:16
Оценка:
0.
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.
Re: Параметр шаблона - строковой литерал.
От: Кодт Россия  
Дата: 05.08.03 14:17
Оценка:
Здравствуйте, limax, Вы писали:

L>Как можно (можно ли вообще?) указать строковой литерал в качестве параметра шаблона?


В качестве параметра шаблона могут выступать указатели на данные с внешней линковкой. Строковые литералы имеют видимость static (внутри модуля), поэтому такой фокус не пройдет.

Что делать:
— объявить глобальную переменную типа const char [] или const char* const
— отказаться от параметризации строкой

А зачем вообще строку передавать?
Перекуём баги на фичи!
Re: Параметр шаблона - строковой литерал.
От: Yacha Россия  
Дата: 05.08.03 14:17
Оценка:
Здравствуйте, 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).
поэтому
textproxy<"teststring1">() //<-- ошибка
... << RSDN@Home 1.0 beta 6a >>
Re[2]: Параметр шаблона - строковой литерал.
От: Павел Кузнецов  
Дата: 05.08.03 14:45
Оценка: +1
Здравствуйте, Lorenzo_LAMAS, Вы писали:

LL>
LL> template<int I>void fun(const char (&ar)[I]);
LL> вызвать можно и так
LL> fun("asdasdsa");
LL>


Это опасный "способ". Например:

fun("111111111");
fun("222222222");


в обоих случаях будет вызвана одна и та же специализация.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Параметр шаблона - строковой литерал.
От: BioUnit Россия  
Дата: 05.08.03 15:03
Оценка:
Однажды стояла такая же проблема, но потом она разрешилась сама собой.
Все строки обычно помещают в ресурсы, и т.о. в шаблон передается не сама строка, а ее ID в ресурсах.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.