That code would work if in the very first declaration of the function, the last parameter has default value, something like this:
//declaration
void error(char const *msg, bool showKind, bool exit = false);
And then in the same scope you can provide default values for other arguments (from right side), in the later declaration, as:
void error(char const *msg, bool showKind = true, bool exit); //okay
//void error(char const *msg = 0 , bool showKind, bool exit); // error
which can called as:
error("some error messsage");
error("some error messsage", false);
error("some error messsage", false, true);
Online Demo : http://ideone.com/aFpUn
Note if you provide default value for the first parameter (from left), without providing default value for the second, it wouldn't compile (as expected) : http://ideone.com/5hj46
§8.3.6/4 says,
For non-template functions, default
arguments can be added in later
declarations of a function in the same
scope.
Example from the Standard itself:
void f(int, int);
void f(int, int = 7);
The second declaration adds default value!
Also see §8.3.6/6.