I was writing some piece of code, where in I have a global namespace and a restricted namespace, say NS1 for now. I have a class called Module in my global namespace and I import some other libraries in NS1, which have a class called Module too. I was trying to create a std::list of my Module, i.e. ::Module inside a function in NS1 and doing so, I got this compilation error

You can seen some of the alternative token consists of letters. So you can write if (a<b and b<c) in a compiler which can correctly handle them. Their existence is for lack of symbols in keyboards or character sets. The alternative tokens are never replaced with the primary one (unlike trigraphs), but them behave the same as the primary one.

However, C++0x require special treatment for <:: (2.5p3):

Otherwise, if the next three characters are <:: and the subsequent
character is neither : nor >, the < is treated as a preprocessor token
by itself and not as the first character of the alternative token <:.

Or probably more for charsets who lacks them.Back in the days of 7-bit charsets. {}[]\ and a few others were often replaced with locale specific umlauts. To not have to write aä2å when using a Swedish computer you could use the alernate form a<:2:> in C ( a(.2.) in Pascal) which is at least slightly more readable.
–
FredrikDec 1 '11 at 8:12