Kde překladač píše chybu? Jestli je problém s aplikací operátoru <<, zkusil bych něco takovéhoto:
template <typename T, typename ... Args>
class logger {
  static void log (T & a1, Args & ... args)
  {
    cout << T;
    log(args);
  }
}
template <>
class logger {
  static void log ()
  {
    cout << endl;
    log(args);
  }
}
Prostě takový trošku funkcionální přístup. Ale berte to jen přibližně, už je to pár let, co jsem si s tímhle hrál. Obvykle se v těchto případech spokojím s variadickým pojetím funkcí z C a formátovacími řetězci.