
Always use a fully qualified name to refer to an integral constant expression.
Correct, but see below.
However, it appears that the same compiler (BCB6) has problems if the '::' is left in. For example...
template <class T> struct Foo { typedef typename ::boost::remove_reference< T >::type type; typedef typename ::boost::add_reference< typename ::boost::add_const< type >::type >::type ref_to_const_type; };
fails to compile. Initially I thought it had something to do with typename (e.g., another BOOST_DEDUCED_TYPENAME) because, the first, simpler line compiles if I remove the "typename" keyword.
The thing is your typedef names a *type*, and *not* an integral constant expression, and as you have discovered, typename can't be followed by :: when using Borland. Keep the typename and remove the :: when using types, but keep in in when refering to values. Simple eh? (Just kidding). John.