По С++ вопрос

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
dEBUGER
Частый Гость
Сообщения: 23
Зарегистрирован: 26 фев 2003, 15:01
Откуда: Toronto

По С++ вопрос

Сообщение 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)
}
dEBUGER
Частый Гость
Сообщения: 23
Зарегистрирован: 26 фев 2003, 15:01
Откуда: Toronto

Блин, я все перепутал... Еще раз:

Сообщение 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) 
} 
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Сообщение 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);
} 
dEBUGER
Частый Гость
Сообщения: 23
Зарегистрирован: 26 фев 2003, 15:01
Откуда: Toronto

ну уже проехали

Сообщение 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]
Ответить