template <typename T> void f( T* p )
{
std::cout << *p;
}
void main() throw()
{
std::vector<int> v(1);
v[0] = 7;
f( &*v.begin() ); // ok
f( v.begin() ); // error C2784: 'void f(T *)' : could not deduce
// template argument for 'T *' from 'std::_Vector_iterator<_Ty,_Alloc>'
}
в шестой студии компилируется. в других нет. собственно есть догадка что итератор вектора это указатель.
как выводятся аргументы? почему итератор не проходит? у него же есть operator*
Здравствуйте, salat, Вы писали:
S>в шестой студии компилируется. в других нет. собственно есть догадка что итератор вектора это указатель.
обычно да, но никаких гарантий нет. S>как выводятся аргументы? почему итератор не проходит? у него же есть operator*
наличие или отсутствие оператора никакого влияния на преобразование типа не оказывает.
Здравствуйте, salat, Вы писали:
S>спасибо за внимание
template <typename T> void f( T* p ) // <-- сюда можно передать только указатель.
{
std::cout << *p;
}
template <typename T> void f( T p ) // <-- а сюда любой тип с оператором *, в том числе и итератор
{
std::cout << *p;
}
Здравствуйте, Константин Б., Вы писали:
КБ>Здравствуйте, salat, Вы писали:
S>>спасибо за внимание
КБ>
КБ>template <typename T> void f( T* p ) // <-- сюда можно передать только указатель.
КБ>{
КБ> std::cout << *p;
КБ>}
КБ>template <typename T> void f( T p ) // <-- а сюда любой тип с оператором *, в том числе и итератор
КБ>{
КБ> std::cout << *p;
КБ>}
КБ>
это я понимаю. я не пойму почему 6й компилятор не дает ошибки? это баг компилятора?
"salat" <61240@users.rsdn.ru> wrote in message news:3339016@news.rsdn.ru...
> это я понимаю. я не пойму почему 6й компилятор не дает ошибки? это баг компилятора?
Там итераторы вектора — просто указатели.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
S>"salat" <61240@users.rsdn.ru> wrote in message news:3339016@news.rsdn.ru...
>> это я понимаю. я не пойму почему 6й компилятор не дает ошибки? это баг компилятора?
S>Там итераторы вектора — просто указатели.
"salat" <61240@users.rsdn.ru> wrote in message news:3339118@news.rsdn.ru...
>>> это я понимаю. я не пойму почему 6й компилятор не дает ошибки? это баг компилятора? > > S>Там итераторы вектора — просто указатели. > > ну и что?
Ну и компилируется Чего ж ему не компилироваться, с указателем-то?
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, salat, Вы писали:
>>> это я понимаю. я не пойму почему 6й компилятор не дает ошибки? это баг компилятора? S>>Там итераторы вектора — просто указатели. S>ну и что?
Ну и всё
Устройство итераторов — личное дело реализации STL.
template<class T> struct xector // так сделано в Dinkum STL, идущей в составе VC6
{
typedef T* iterator;
iterator begin();
};
template<class T> struct yector // так сделано в других версиях STL
{
struct iterator
{
T& operator *() const;
T* operator ->() const;
};
iterator begin();
};
template<class T> struct zector // не понятно, кому бы могло придти в голову такое...
{
struct iterator
{
operator T*() const;
};
iterator begin();
};
template<class T> void f(T*);
int main()
{
xector<int> x;
yector<int> y;
zector<int> z;
f(x.begin()); // можно
f(y.begin()); // ошибка: yector<int>::iterator вообще не приводится к какому-либо T*
f(z.begin()); // ошибка: запрещено двойное неявное приведение (пользовательский оператор + вывод параметров шаблона)
f<int>(z.begin()); // можно
f((int*)z.begin()); // можно
}
Здравствуйте, salat, Вы писали:
S>Здравствуйте, Константин Б., Вы писали:
КБ>>Здравствуйте, salat, Вы писали:
S>>>спасибо за внимание
КБ>>
КБ>>template <typename T> void f( T* p ) // <-- сюда можно передать только указатель.
КБ>>{
КБ>> std::cout << *p;
КБ>>}
КБ>>template <typename T> void f( T p ) // <-- а сюда любой тип с оператором *, в том числе и итератор
КБ>>{
КБ>> std::cout << *p;
КБ>>}
КБ>>
S>это я понимаю. я не пойму почему 6й компилятор не дает ошибки? это баг компилятора?
Нет это значит что в stl шестерки итератор вектора является указателем.