Unfortunately, individual initializations of this sort are likely to be considered errors eventually; since they're needed now, you might want to flag places where you use them with comments to mark the need for a future transition.
Member functions in template classes may not have results of nested type; gnu C++ signals a syntax error on the attempt. The following example illustrates this problem with an enum type alph :
template <class T> class list {
...
enum alph {a,b,c};
alph bar();
...
};
template <class T>
list<int>::alph list<int>::bar() // Syntax error here
{
...
}
A parsing bug makes it difficult to use preprocessor conditionals within templates. For example, in this code:
template <class T>
class list {
...
#ifdef SYSWRONG
T x;
#endif
...
}
The preprocessor output leaves sourcefile line number information (lines like `# 6 "foo.cc"' when it expands the #ifdef block. These lines confuse the compiler while parsing templates, giving a syntax error.
If you cannot avoid preprocessor conditionals in templates, you can suppress the line number information using the `-P' preprocessor option (but this will make debugging more difficult), by compiling the affected modules like this:
g++ -P foo.cc -o foo
Parsing errors are reported when templates are first instantiated---not on the template definition itself. In particular, if you do not instantiate a template definition at all, the compiler never reports any parsing errors that may be in the template definition.