Q:

why don't boost tuple operator == and << compile?

This boost::tuples doc page says:

Tuples reduce the operators ==, !=, <, >, <= and >= to the corresponding elementary operators. This means, that if any of these operators is defined between all elements of two tuples, then the same operator is defined between the tuples as well.

It also says:

The global operator<< has been overloaded for std::ostream such that tuples are output by recursively calling operator<< for each element.

The example code given there looks like these features should be trivially usable.
So why does this code fail to compile?
#include <iostream>
#include <boost/tuple/tuple.hpp>

int main()
{
    using namespace std;
    using namespace boost;
    using namespace boost::tuples;

    tuple<int, int> t1(0, 0);
    tuple<int, int> t2(0, 0);
    cerr << "t1: " << t1 << endl;
    cerr << "t2: " << t2 << endl;
    if (t1 == t2) { cerr << "equal\n"; } else { cerr << "notequal\n"; }
    return 0;
}

With g++ -Wall -Wextra -Werror tuple.cxx -o tuple I get:
tuple.cxx: In function ‘int main()’:
tuple.cxx:12:17: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘boost::tuples::tuple<int, int>’)
  cerr << "t1: " << t1 << endl;
                 ^

and an avalanche of related errors.
Similar behavior from both libboost-1.54 and 1.58, g++-4.8.4 and 5.4.0 on ubuntu 14.04 and 16.04 respectively.

A:

The page you linked to also says

To use the library, just include:
#include "boost/tuple/tuple.hpp"

Comparison operators can be included with:
#include "boost/tuple/tuple_comparison.hpp"

To use tuple input and output operators,
#include "boost/tuple/tuple_io.hpp"

