Этот код будет работать, если в самом первом объявлении функции последний параметр имеет значение по умолчанию, что-то вроде этого:
//declaration
void error(char const *msg, bool showKind, bool exit = false);
А затем в той же области действия вы можете указать значения по умолчанию для других аргументов (с правой стороны) в более позднем объявлении, как:
void error(char const *msg, bool showKind = true, bool exit); //okay
//void error(char const *msg = 0 , bool showKind, bool exit); // error
который может называться:
error("some error messsage");
error("some error messsage", false);
error("some error messsage", false, true);
Онлайн-демонстрация: http://ideone.com/aFpUn
Обратите внимание, что если вы укажете значение по умолчанию для первого параметра (слева) без указания значения по умолчанию для второго, оно не будет скомпилировано (как и ожидалось): http://ideone.com/5hj46
§8.3.6 / 4 говорит,
По умолчанию для не шаблонных функций
аргументы могут быть добавлены позже
объявления функции в том же
Объем.
Пример из самого стандарта:
void f(int, int);
void f(int, int = 7);
Второе объявление добавляет значение по умолчанию!
Также см. §8.3.6 / 6.