In C++ you do not have to use the "struct" keyword to declare a structure. In C, you do.
struct t n:
Because you didn't specify that you meant the type foo::t, you inadvertently declared a new anonymous struct named t, local to the main function (that's the ::main():: in the error message). That anonymous struct has no definition, so that's why it's an "incomplete type".
In other words, you've said n's type is some anonymous structure that's totally different than the one defined in ::foo.
Write struct foo::t n = foo:: bong (" world"); or just foo::t n = foo:: bong (" world"); to get what you want.