[vox-tech] grokking g++ errors

Micah J. Cowan micah at cowan.name
Thu Feb 2 13:12:27 PST 2006


On Thu, Feb 02, 2006 at 02:59:35PM -0500, Peter Jay Salzman wrote:
> On Thu 02 Feb 06, 10:21 AM, Jeff Newmiller <jdnewmil at dcn.davis.ca.us> said:
> > 
> > You didn't ask for assistance in actually troubleshooting this problem, but
> > templates traditionally must be defined before they are instantiated in the
> > source.  It is possible that newer compilers can handle definition after
> > instantiation, but I don't know how they do it.
> 
> Sorry for being so dense, but I'm just now starting to try to really learn
> function and class templates.
> 
> Do you mean that the template function definition must be seen before the
> any calls to the function is made (I assume that's the instantiation)?
> 
> I guess what I'm asking is -- is the template function's prototype not
> enough?  The actual definition must be seen before any calls to the function
> are made?

IIRC this should not be true (though I'll point out that in your sample
code, no such prototype has been provided); however, for many
implementations, it is. You may also need to explicitly tell g++ to
instantiate that template into an actual function definition. Something
like:

  template void split(const string &str,
                      back_insert_iterator<vector<string>>);

but that may not be necessary.

Realize that defining a function /template/ does not define any
function, only a template. That's what /instantiating/ the template
does. It makes it easy on the compiler if the function template's
definition is in scope at the time you implicitly or explicitly
instantiate it, and some compilers may require this, though the C++
stnadard does not (only that it's in the same "translation unit"
somewhere).

I'd be happy to help you debug the problem if you want to give me access
to the actual code.

-- 
HTH,

Micah J. Cowan
micah at cowan.name


More information about the vox-tech mailing list