我收到錯誤<:無法在g ++編譯器上開始模板參數列表。代碼<:無法開始模板參數列表
template<typename T> class SomeClass;
class Class;
SomeClass<::Class>* cls;
我收到錯誤<:無法在g ++編譯器上開始模板參數列表。代碼<:無法開始模板參數列表
template<typename T> class SomeClass;
class Class;
SomeClass<::Class>* cls;
根據Maximal Munch tokenization principle有效的C++令牌必須收集/儘可能多的連續字符。
<:
是digraph(符號[
的替代表示)。
Digraph Equivalent
<: [
:> ]
<% {
%> }
%: #
所以SomeClass<::Class>* cls;
被解釋爲SomeClass[:Class>* cls;
不作任何意義。
解決方法:添加一個空格<
和:
SomeClass< ::Class>* cls;
^
|
White Space
用C++ 11的回答這個問題,修改了一下。
預C++ 11
上一頁到C++ 11,其在詞法分析用於避免歧義,並採取儘可能多的元件,因爲它可以形成一個有效的標記導致該工作的maximal munch rule:
<::
生成以下令牌爲:
<: :
<:
是digrap小時,這將轉換爲[
,因此您最終得到:
SomeClass[:Class>* cls;
這是無效的代碼。
我們可以證實,這是通過進入草案C++標準節2.4
預處理的情況下令牌它說:
如果輸入流已被解析成預處理標記多達 給定字符,下一個預處理令牌是可以構成預處理令牌的最長字符序列 ,即使導致進一步的詞法分析失敗的 也是如此。
,並提供了幾個例子,包括以下經典最大適合的問題:
[實施例:程序片段X +++++ y被解析爲x ++ ++ + Y, 其中,如果x和y屬於內置類型,即使解析x ++ + ++ y可能會產生 正確表達式,也會違反增量運算符上的約束。末端示例]
C++ 11
在C++ 11此變化中,規則被雕刻出對於這種情況和draft C++11 standard加入下列:
否則,如果接下來的三個字符是< ::和後續的 字符既不是:也不是>,則<本身被視爲預處理器標記 ,而不是作爲備用標記的第一個字符<:。
第2.5
預處理標記。所以這段代碼將不再產生C++ 11中的錯誤。
這種變化從defect report: 1104
新standrard(C++ 0x中)解決的問題>>像在來了>。它是否也解決了這個問題?順便說一下,Micorosoft編譯器不會給出錯誤(我知道他們在技術上應該,但他們不這樣做很好) – 2010-10-17 09:59:07
@ArmenTsirunyan是的,這是固定在C++ 0x,它成爲C++ 11,雖然修復'>>'是在'14.3'節中完成的,它不同於<::'的修改,它是最大規則的修改。所以工作中既煩人又不同的核心問題。我在回答中詳細說明了這一點。 – 2014-07-27 02:30:59