Q:

Function template specialization without templated argument

Let's look on a template function which take void argument and returns void:
template<class T>
void f() {
    cout << "template" << endl;
}

Later we specialize this function:
template<>
void f<int> () {
    cout << "int" << endl;
}
template<>
void f<double> () {
    cout << "double" << endl;
}

int main() {
    f<int> ();
    f<double> ();
}

The question is why this compiles?  We have three function with the same signature:
void(void), and I expected that it should broke with multiple declaration? 

A:

This is because you are explicitly stating which function to use.  f<int>() can not map to f<double>() because of the difference in template argument; i.e. this is a completely unambiguous call.