#ifndef _PAIR_H_
#define _PAIR_H_

// Class template definition has the template
// parameter ("Thing") in scope throughout
template <typename Thing> class Pair {
 public:
  Pair() { };  // default constructor still initializes data members

  Thing get_first() const { return first_; }    // inline definition
  Thing get_second() const { return second_; }  // inline definition
  void set_first(Thing &copyme);
  void set_second(Thing &copyme);
  void Swap();

 private:
  Thing first_, second_;
};

// Nonmember function declaration -- not needed for
// compilation since Pair.cc is included in this header
// file, but good to make visible to customer.
template <typename T>
ostream &operator<<(ostream &out, const Pair<T> &p);

// The compiler must see the definition for any template that is
// used.  That means customers of Pair.h need to be
// shown the definition of class Pair; one way to do this is to
// include the .cc file associated with the .h file right in 
// the header, as follows.  This is the "inclusion compilation
// model."
#include "Pair.cc"

#endif  // _PAIR_H_