Здравствуйте, ArtDenis, Вы писали:
AD>Неоднозначность происходит в том случае,
Опять, я не спрашиваю почему происходит неоднозначность, я спрашиваю почему она должна происходить, улавливаешь разницу?
AD>Чтобы разрулить твою ситуацию можно сделать так:
AD>AD>#include <iostream>
AD>template<int size> char* test(char (&str)[size])
AD>{
AD> std::cout << "char (&str)[size]" << std::endl;
AD> return NULL;
AD>}
AD>template<typename T> char* test(T *str);
AD>template<> char* test(char *str)
AD>{
AD> std::cout << "char *str" << std::endl;
AD> return NULL;
AD>}
AD>int main()
AD>{
AD> char arr[] = "data1";
AD> char *ptr = "data2";
AD> test(arr);
AD> test(ptr);
AD> return 0;
AD>}
AD>
Если это работает на GCC, то тем более, как мне кажется, должно также и это работать:
char* test(char (&)[10]) {
return NULL;
}
char* test(char*) {
return NULL;
}
void main() {
char arr[10] = "";
test(arr); //вызов char* test(char (&)[10])
}
AD>В этом случае обе функции будут шаблонные (правда одна из них — специализированная) 
под vs80 не работает
PS:
Есть здесь знатоки стандарта, что по этому поводу он говорит?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]