You need to put typename
in front of that line, since the type you do ::iterator upon is dependant on the template-parameter T. Like this:
template< class T >
void example() {
typename std::list< boost::function<T ()> >::iterator it;
}
Consider the line
std::list< boost::function<T ()> >::iterator * it;
which could mean a multiplication, or a pointer. That's why you need typename
to make your intention clear. Without it, the compiler assumes not a type, and thus it requires an operator there or a semicolon syntactically.
Also consult the new C++ FAQ entry Where to put template and typename on dependent names.