エラー <: cannot begin a template argument list on g++ コンパイラ. コード
template<typename T> class SomeClass;
class Class;
SomeClass<::Class>* cls;
エラー <: cannot begin a template argument list on g++ コンパイラ. コード
template<typename T> class SomeClass;
class Class;
SomeClass<::Class>* cls;
Maximal Munch トークン化の原則によると、有効な C++ トークンは、できるだけ多くの連続した文字を収集する必要があります。
<:
有向グラフ(シンボルの代替表現[
) です。
Digraph Equivalent
<: [
:> ]
<% {
%> }
%: #
だから、意味をなさないSomeClass<::Class>* cls;
と解釈されます。SomeClass[:Class>* cls;
<
解決策: と の間に空白を追加します:
SomeClass< ::Class>* cls;
^
|
White Space
代わりに次のことを試してください。
SomeClass< ::Class>* cls;
詳細については、ダイグラフに関するこの質問を参照してください。トリグラフに関するこの質問も役立つ可能性があります。
C++11 では、この質問に対する答えが少し変わります。
C++11より前
C++11 より前のバージョンでは、字句解析であいまいさを回避するために使用され、有効なトークンを形成するためにできるだけ多くの要素を取得することで機能する最大マンチ ルールが原因でした。
<::
次のトークンを次のように生成します。
<: :
<:
は、次のように変換されるダイグラフである[
ため、次のようになります。
SomeClass[:Class>* cls;
これは有効なコードではありません。
これが事実であることを確認するには、C++ 標準のドラフト セクション「2.4
トークンの前処理」に移動します。
入力ストリームが指定された文字までの前処理トークンに解析された場合、次の前処理トークンは、前処理トークンを構成できる最長の文字シーケンスです。これにより、それ以上の語彙分析が失敗する可能性があります。
次の古典的な最大ムンクの質問を含むいくつかの例を提供します。
[例: プログラム フラグメント x+++++y は x ++ ++ + y として解析されます。これは、x と y が組み込み型の場合、解析 x + であっても、インクリメント演算子の制約に違反します。 + + ++ y は正しい式を生成する可能性があります。—終わりの例]
C++11
C++11 ではこれが変更され、この場合のルールが作成され、ドラフト C++11 標準では次のことが追加されました。
それ以外の場合、次の 3 文字が <:: であり、後続の文字が : でも > でもない場合、< は単独でプリプロセッサ トークンとして扱われ、代替トークン <: の最初の文字としては扱われません。
セクション2.5
前処理トークンへ。そのため、このコードは C++11 では生成されず、エラーになります。
この変更は、不具合レポートからのものです: 1104
< 文字の前後にスペースを入れます。
SomeClass < ::Class > * cls;
実際には < と : を分離するだけでよいのですが、私は対称性が好きです。