2014-02-06 7 views
-2

У меня есть функция, принимающая переменную любого типа. Теперь, , если переменная char* или const char*, мне нужно знать длину. Как это сделать?Шаблон strnlen mess

Функция ребой не компилируется. subscript requires array or pointer type

template <typename Type> 
unsigned long get_len(Type in) 
{ 
    unsigned long i = 0; 
    while (in[i]) ++i; 
    return i; 
} 
+4

Если функция может принимать переменную * любого типа, то почему вам нужно знать длину, только если это строка? – Brian

+0

Я обрабатываю каждый тип по-разному, если он похож на строку и по-другому, если это int-like – JoeFrom

+0

[Компиляция отлично для меня.] (Http://coliru.stacked-crooked.com/a/220d4f5ead77e94b) Можете ли вы опубликовать [SSCCE] (http://sscce.org)? Не имея возможности воспроизвести вашу ошибку, никто не сможет дать вам точный ответ. –

ответ

0

Провал компиляции возникает, когда шаблон экземпляр.

Предположительно эта функция потенциально вызывается из другого кода шаблона, что-то вроде:

template <typename Type> 
void f(Type in) 
{ 
    unsigned l = get_len(in); 
    // etc. 
} 
char* s= "hi"; 
f(s); // Compiles OK. 
int i = 0; 
f(i); // Compile failure. 

Вопрос, следовательно, что get_len не имеет смысла, когда Type не является типом массива, и вы не должны вызывать его из другие экземпляры шаблона.

Как указано в другом месте, решение для базового шаблона не вызывает get_len.

Затем вы можете создать либо специализированную специализацию шаблона, либо просто обычную перегрузку, которая обрабатывает случай char* и вызывает get_len(char*), который затем не должен быть шаблоном.

0

Ну сама ошибка легко решить, просто шаблон на Type*, что означает PTR любого типа, как это:

unsigned long get_len(Type* in) 

Однако, вы будете иметь гораздо более серьезные проблемы, позже, видя, как это сильно не удастся с помощью строк, которые не завершены нулем. (+ Она будет принимать любой массив, который обычно обнулить не прекращается, и так далее.)


Действительно, правильно сдерживая типы шаблонов относительно сложная тема, судя по комментариям, что вы хотите сделать, это не хорошая идея.

1

При определении шаблонной функции, это нормально, чтобы перегрузить ее с помощью нетемплируемой функции. Поэтому для вашей функции, которая должна обрабатывать char * по-другому, перегрузите ее.

например:

void AnyTypeFunction(char* type); 

и

template<typename Type> void AnyTypeFunction(Type type); 
+0

Я все еще не могу понять, как это отвечает на вопрос, отказывается ли OP от его использования, что дает ошибку компилятора. –

+0

Я отвечаю на вопрос в OP: «У меня есть функция, принимающая переменную любого типа. Теперь, если переменная char * или const char *, мне нужно знать длину. Как это сделать?» Его функция не будет компилироваться, если вы никогда не попытаетесь вызвать get_len с помощью int. – m24p

+0

Вы имеете в виду, что он скомпилируется, если вы не вызываете его с помощью int. –