Здравствуйте, Vain, Вы писали:
V>Вот, почему не компилируется. Я не спрашиваю про техническую сторону, она понятна, почему такое вообще не разрешено, каковы причины? Может есть какой пример, который может показать почему должна происходить неоднозначность?
Неоднозначность происходит в том случае, когда компилятор не знает, вызов какой функции надо подставить, т.к. аргуметы одинаково хорошо подходят для нескольких перегруженных функций:
void test(char (&str)[10]) {}
void test(char *str) {}
char arr[10];
test(arr); // Здесь одинаково хорошо можно подходит char *str и char (&)[10],
// т.к. массив может передаваться как по указателю, так и по сылке на свой тип
Но в твоём первом примере неоднозначности не происходит, т.к. как тебе уже ответили нешаблонная ф-ция имеет приоритет перед шаблонной.
Чтобы разрулить твою ситуацию можно сделать так:
#include <iostream>
template<int size> char* test(char (&str)[size])
{
std::cout << "char (&str)[size]" << std::endl;
return NULL;
}
template<typename T> char* test(T *str);
template<> char* test(char *str)
{
std::cout << "char *str" << std::endl;
return NULL;
}
int main()
{
char arr[] = "data1";
char *ptr = "data2";
test(arr);
test(ptr);
return 0;
}
В этом случае обе функции будут шаблонные (правда одна из них — специализированная)

Это работает на GCC 3.4.2. на остальных — не знаю
... << RSDN@Home 1.1.4 stable rev. 510>>