2010-10-17 18 views
18

我收到錯誤<:無法在g ++編譯器上開始模板參數列表。代碼<:無法開始模板參數列表

template<typename T> class SomeClass; 
class Class; 

SomeClass<::Class>* cls; 
+1

新standrard(C++ 0x中)解決的問題>>像在來了>。它是否也解決了這個問題?順便說一下,Micorosoft編譯器不會給出錯誤(我知道他們在技術上應該,但他們不這樣做很好) – 2010-10-17 09:59:07

+0

@ArmenTsirunyan是的,這是固定在C++ 0x,它成爲C++ 11,雖然修復'>>'是在'14.3'節中完成的,它不同於<::'的修改,它是最大規則的修改。所以工作中既煩人又不同的核心問題。我在回答中詳細說明了這一點。 – 2014-07-27 02:30:59

回答

33

根據Maximal Munch tokenization principle有效的C++令牌必須收集/儘可能多的連續字符。

<:digraph(符號[的替代表示)。

      Digraph Equivalent 
           <:   [ 
           :>   ] 
           <%   { 
           %>   } 
           %:   # 

所以SomeClass<::Class>* cls;被解釋爲SomeClass[:Class>* cls;不作任何意義。

解決方法:添加一個空格<:

SomeClass< ::Class>* cls; 
      ^
      | 
      White Space 
11

之間,而不是嘗試以下操作:

SomeClass< ::Class>* cls; 

你可以找到大約有向圖this問題的詳細信息。 This關於trigraphs的問題也可能有幫助。

2

圍繞<字符加空格:

SomeClass <::Class> * cls; 

你只真正需要區分<和:,但我喜歡對稱。

+0

加上一個喜歡對稱 – Mawg 2015-09-11 12:33:49

7

用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