Re[9]: Почему вызывается test(char*)?
От: ArtDenis Россия  
Дата: 13.09.06 19:42
Оценка:
Здравствуйте, 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>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.