This is almoast the same thing if you would have asked this:
I declare this function (sum) somewhere, and I use it like this:
int sum(int a,int b);
int main(void){ sum(1,2); }
but I don't implement it anywhere, how could I get a compiler warning?

Of course, you won't. The compiler will compile every cpp based on the declarations it founds mostly in files like .h. If everything seems to be in order syntactic and semantic, it will throw no warning or errors. Is the liker's job to assemble all the implementations together and bind the related links.

In case of template functions, it is a little bit more complicated, but respects the same principle. Basicly the compiler compiles twice the template functions. First it check the generic implementation for syntactic errors, and then, when a particular instantiation is done, it checks again for semantic errors just like in any other function.
In your case doesn't apply, because you haven't implemented, just like you said, neither the generic template, neither a specialization for string const &. So as I said above, this is a linker's job only.
To get a compiler warning, you need to implement the template function template<typename ANY> void func(ANY&);, because you are tricking the compiler that this function exists, doesn't.