This might help you Forward declarations of structs are always permissible in C. However, not very many types can be used this way. For example, you can't use a forward declaration for FILE simply because the tag name of the struct is not specified (and theoretically, it may not be a struct at all). Section 7.1.4 paragraph 2 of n1570 gives you permission to do the same with functions:
/* my code here */
it fixes the issue Declaring vector in the std namespace is undefined behavior. So, your code might work, but it also might not, and the compiler is under no obligation to tell you when your attempt won't work. That's a gamble, and I don't know that avoiding the inclusion of a standard C++ header is worth that. See the following comp.std.c++.moderated discussion:
Will the standard library of C++11 have forward declaration headers?
Hope that helps As @molbdnilo pointed out, there is nothing wrong with forward declaring with namespace. First option is not an option at all, for various reasons I dont want to include header until I have to, forward declaration is always preferred way. Why dont you just provide a header with forward declarations as many boost implementations do? for example boost spirit numerics_fwd.hpp? Ah, missed @DevSolar comment. IMHO this is the best solution.
Forward-declare struct which only has definition in a library cpp