I get an error <: cannot begin a template argument list on g++ compiler. Code
template<typename T> class SomeClass;
class Class;
SomeClass<::Class>* cls;
I get an error <: cannot begin a template argument list on g++ compiler. Code
template<typename T> class SomeClass;
class Class;
SomeClass<::Class>* cls;
With C++11 the answer to this question changes a bit.
Pre C++11
Previous to C++11 the maximal munch rule which is used in lexical analysis to avoid ambiguities and works by taking as many elements as it can to form a valid token caused this:
to generate the following tokens as:
<:
is a digraph which translates to[
and so you end up with:which is not valid code.
We can confirm that this is the case by going to the draft C++ standard section
2.4
Preprocessing tokens which says:and provides a couple of examples including the following classical maximal munch question:
C++11
In C++11 this changes, a rule was carved out for this case and the draft C++11 standard added the following:
to section
2.5
Preprocessing tokens. So this code will no longer produce and error in C++11.This change came from defect report: 1104
Put spaces around the < characters:
You only actually need to separate < and :, but I like symmetry.
Try the following instead:
You can find more info in this question about digraphs. This question about trigraphs could be helpful also.
According to the Maximal Munch tokenization principle a valid C++ token must collect/have as many consecutive characters as possible.
<:
is a digraph (an alternative representation of symbol[
).So
SomeClass<::Class>* cls;
is interpreted asSomeClass[:Class>* cls;
which doesn't make any sense.Solution: Add a whitespace between
<
and: