parameter deducing
От: salat Россия  
Дата: 23.03.09 08:55
Оценка:
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*

спасибо за внимание
Re: parameter deducing
От: jazzer Россия Skype: enerjazzer
Дата: 23.03.09 08:57
Оценка:
Здравствуйте, salat, Вы писали:

S>в шестой студии компилируется. в других нет. собственно есть догадка что итератор вектора это указатель.

обычно да, но никаких гарантий нет.
S>как выводятся аргументы? почему итератор не проходит? у него же есть operator*
наличие или отсутствие оператора никакого влияния на преобразование типа не оказывает.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: parameter deducing
От: K13 http://akvis.com
Дата: 23.03.09 10:22
Оценка:
S>    f( &*v.begin() );   // ok

заменить на
 f( &(v[0]) );   // ok


и все будет нормально везде (кроме std::vector<bool> разумеется)
Re: parameter deducing
От: Константин Б. Россия  
Дата: 23.03.09 11:19
Оценка:
Здравствуйте, salat, Вы писали:

S>спасибо за внимание



template <typename T> void f( T* p ) // <-- сюда можно передать только указатель.
{
    std::cout << *p;
}

template <typename T> void f( T p ) // <-- а сюда любой тип с оператором *, в том числе и итератор
{
    std::cout << *p;
}
Re[2]: parameter deducing
От: salat Россия  
Дата: 23.03.09 11:26
Оценка:
Здравствуйте, Константин Б., Вы писали:

КБ>Здравствуйте, salat, Вы писали:


S>>спасибо за внимание



КБ>
КБ>template <typename T> void f( T* p ) // <-- сюда можно передать только указатель.
КБ>{
КБ>    std::cout << *p;
КБ>}

КБ>template <typename T> void f( T p ) // <-- а сюда любой тип с оператором *, в том числе и итератор
КБ>{
КБ>    std::cout << *p;
КБ>}
КБ>


это я понимаю. я не пойму почему 6й компилятор не дает ошибки? это баг компилятора?
Re[3]: parameter deducing
От: Sergey Россия  
Дата: 23.03.09 11:45
Оценка:
"salat" <61240@users.rsdn.ru> wrote in message news:3339016@news.rsdn.ru...

> это я понимаю. я не пойму почему 6й компилятор не дает ошибки? это баг компилятора?


Там итераторы вектора — просто указатели.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: parameter deducing
От: salat Россия  
Дата: 23.03.09 12:26
Оценка:
Здравствуйте, Sergey, Вы писали:


S>"salat" <61240@users.rsdn.ru> wrote in message news:3339016@news.rsdn.ru...


>> это я понимаю. я не пойму почему 6й компилятор не дает ошибки? это баг компилятора?


S>Там итераторы вектора — просто указатели.


ну и что?
Re[5]: parameter deducing
От: Sergey Россия  
Дата: 23.03.09 12:55
Оценка:
"salat" <61240@users.rsdn.ru> wrote in message news:3339118@news.rsdn.ru...

>>> это я понимаю. я не пойму почему 6й компилятор не дает ошибки? это баг компилятора?

>
> S>Там итераторы вектора — просто указатели.
>
> ну и что?

Ну и компилируется Чего ж ему не компилироваться, с указателем-то?
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[5]: parameter deducing
От: Кодт Россия  
Дата: 23.03.09 13:18
Оценка: 1 (1) +1
Здравствуйте, 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()); // можно
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[3]: parameter deducing
От: Константин Б. Россия  
Дата: 23.03.09 18:11
Оценка:
Здравствуйте, 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 шестерки итератор вектора является указателем.
Re[6]: parameter deducing
От: Аноним  
Дата: 23.03.09 22:27
Оценка:
Кажется я понял. Ключевой слово тут typedef

Спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.