Странно, почему-то в одном случае 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() );
}
Соображения есть?
Может что-то с порядком инстанциирования шаблонов? Но что?
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&only=1Автор: Павел Кузнецов
Дата: 27.02.04
http://rsdn.ru/Forum/Message.aspx?mid=553521&only=1Автор: Павел Кузнецов
Дата: 27.02.04
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, 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;
}
}
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
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен