Страница 1 из 1
По С++ вопрос
Добавлено: 29 апр 2003, 11:51
dEBUGER
Как заставить MS VC компилятор различать ссылки и указатели
при инстанциировании шаблона функции (о, великий и могучий русский язык, оказывается, можно перевести

)
Проблема следующая (см код ниже):
компилятор как мне видится,
1) не выводит тип
2) не отличает ссылку от значения
Код: Выделить всё
template <typename _T> int foo(_T* pT) {
//do smth for pointers
}
template <typename _T> int foo(_T& pT) {
//do something symantically else for references
}
main () {
X x;
X& rx=x;
X* px=&
foo<X*>(px); // explicit -> fine.
foo<X&>(rx); // doesn't work :-(( (№2)
foo(px); // error C2667: 'foo' : none of 2 overload have
foo(rx); // a best conversion (№1)
}
Блин, я все перепутал... Еще раз:
Добавлено: 29 апр 2003, 11:59
dEBUGER
Компилятор не выводит правильный тип, вот проблема.
Остальное все отменяется.
Код:
Код: Выделить всё
template <typename _T> int foo(_T* pT) {
//do smth for pointers
}
template <typename _T> int foo(_T& pT) {
//do something symantically else for references
}
main () {
X x;
X& rx=x;
X* px=&
foo<X>(px); // explicit -> fine.
foo<X>(rx); //
foo(px); // error C2667: 'foo' : none of 2 overload have
foo(rx); // a best conversion (№1)
}
Добавлено: 30 апр 2003, 13:59
Woozy
foo - это имя для двух разных template'ов функции. Ну и хорошо. Но - почему ты пытаешься использовать для вызова функции одно
имя template, не специфицируя никакого параметра для этого template? Если мне не изменяет память - то этому шаблону надо какой-то тип сначала подсунуть, перед использованием.
Или это где-то описано - после того как темплэйт один раз задействовал - можно просто по его имени обращаться, не специфицируя типы которые в его параметрах?
Код: Выделить всё
template <typename _T> int foo(_T* pT) {
//do smth for pointers
}
template <typename _T> int foo(_T& pT) {
//do something symantically else for references
}
main () {
X x;
X& rx=x;
X* px=&
foo<X*>(px); // explicit -> fine.
foo<X&>(rx); // not sure if templates work like this
// Where the hell did you get function "foo"? ;)
foo(px);
foo(rx);
}
ну уже проехали
Добавлено: 01 май 2003, 14:36
dEBUGER
ответ на мой вопрос = "видимо никак"
А теперь на твой вопрос - переопределенная
template-функция, если тип не задан явно, пытается вывести (deduct) точный тип переданного параметра и, если компитятору это удастся, он использует ее для инстанциирования. Т.е., следующий код должен компилироваться. Но не компилируется!
Код: Выделить всё
class X;
template <typename _T> int foo(_T x) {return 1;}
template <typename _T> int foo(_T* x) {return 2;}
template <typename _T> int foo(const _T& x) {return 3;}
void main () {
X x;
X *px = &
const X &rx = x;
cout << foo(x)
<< foo(px)
<< foo(rx) << endl;
}
Я попробовал под gcc - тот дает более осмысленные комментарии, типа
(сразу яснее почему)
tempfunc.cpp:8: candidates are: int foo<X>(X *)
tempfunc.cpp:9: int foo<X *>(X *const &)
Зачем это нужно- ясно- реализовать одно имя функции и разное поведение для ссылок и указателей.
[/code]