ostream_iterator
От: Undead  
Дата: 26.10.04 21:24
Оценка:
Странно, почему-то в одном случае VC++ 7.1 компилит, а в другом нет.

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <utility>
using namespace std;

template <typename T>
ostream& operator << (ostream& out, pair<T, T> v)
{
    return out << "first: " << v.first << ", second: " << v.second;
}

template <typename Iterator>
void print(Iterator first, Iterator last, ostream& out = cout)
{
    typedef iterator_traits<Iterator>::value_type T;
    copy( first, last, ostream_iterator<typename T>(out, "\n") );
}

struct ZeroValue 
{
    operator int() { return 0; }
};

int main()
{
    //typedef pair<int, int> MyPair;              // не работает (!)
    typedef pair<ZeroValue, ZeroValue> MyPair;    // работает
    vector<MyPair> v(10);
    print( v.begin(), v.end() );
}


Соображения есть?
Может что-то с порядком инстанциирования шаблонов? Но что?
Re: ostream_iterator
От: Павел Кузнецов  
Дата: 26.10.04 22:00
Оценка: 5 (2)
Undead:

>
> template <typename T>
> ostream& operator << (ostream& out, pair<T, T> v)
> {
>     return out << "first: " << v.first << ", second: " << v.second;
> }
>
>     //typedef pair<int, int> MyPair;              // не работает (!)
>     typedef pair<ZeroValue, ZeroValue> MyPair;    // работает
>

>
> Соображения есть?

Да

> Может что-то с порядком инстанциирования шаблонов? Но что?


Не совсем. Дело в том, что глобальный namespace не рассматривается при поиске operator << для std::pair<int,int>, и рассматривается для std::pair<ZeroValue,ZeroValue>. Подробнее (см. также ссылки в указанных сообщениях):
http://rsdn.ru/Forum/Message.aspx?mid=553294&amp;only=1
Автор: Павел Кузнецов
Дата: 27.02.04

http://rsdn.ru/Forum/Message.aspx?mid=553521&amp;only=1
Автор: Павел Кузнецов
Дата: 27.02.04
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: ostream_iterator
От: korzhik Россия  
Дата: 26.10.04 22:05
Оценка:
Здравствуйте, Undead, Вы писали:

U>Странно, почему-то в одном случае VC++ 7.1 компилит, а в другом нет.

U>Соображения есть?

namespace std
{

    template <typename T>
    ostream& operator << (ostream& out, pair<T, T> v)
    {
        return out << "first: " << v.first << ", second: " << v.second;
    }

}
Re[2]: ostream_iterator
От: Павел Кузнецов  
Дата: 27.10.04 00:10
Оценка: +1
korzhik:

>
> namespace std { 
>     template <typename T>
>     ostream& operator << (ostream& out, pair<T, T> v)
>


Behavior is undefined (17.4.3.1).
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: ostream_iterator
От: Undead  
Дата: 27.10.04 18:17
Оценка:
Всем спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.