// file: date.h
#include <cstdio>

class date
{
  friend bool operator<(date d1, date d2);
public:
  // constructor    
  date(int y=2015, int m=1, int d=1) : year(y), month(m), day(d) { }
  // explicit constructor
  explicit date(const char *s);
private:
  int year;
  int month;
  int day;
};

// question: use member or global operators?
bool operator<(date d1, date d2);
inline bool operator==(date d1, date d2) { return !(d1<d2 || d2<d1); }
inline bool operator!=(date d1, date d2) { return d1<d2 || d2<d1; }
inline bool operator<=(date d1, date d2) { return !(d2<d1); }
inline bool operator>=(date d1, date d2) { return !(d1<d2); }
inline bool operator>(date d1, date d2)  { return d2<d1; }


// file: date.cpp
date:: date(const char *s)
{
  sscanf(s, "%d.%d.%d", &year, &month, &day);
}

bool operator<(date d1, date d2)
{
  return d1.year < d2.year || d1.month < d2.month || d1.day < d2.day;
}


// file: main.cpp
int main()
{
  date d(2015, 3, 12);

  if (d < date(2000, 1, 1))         // works: explicit call of constructor 
  {
    /* ... */
  }
  else if (d < 2000)                // works: implicit constructor
  {
    /* ... */
  }
  else if (d < "2015.1.12")         // does not work: explicit constructor
  {
    /* ... */
  }
  else if (d < date("2015.1.12"))   // works: explicit call of constructor 
  {
    /* ... */
  }
}