簡體   English   中英

編譯器的不同行為-模板模板參數

[英]Different behavior of compilers - template template argument

假設我有以下代碼:

template <template <typename> class T>
class A {};

template <typename T>
class B
{
    A<B> instance;
};

int main()
{
   B<int> instance;
}

gcc 4.7.2和gcc 4.8.0可以將此代碼正確編譯,而icc 13.0.1和clang 3.2給了我一個錯誤(clang需要:: B而不是B,而icc在模板實例中的<之后也需要空格)。

誰是對的?

我找到了有關該線程的信息( Template class類是否將自身稱為模板template參數? ),但我無法理解該標准的14.6.1 / 2,還看到了LLVM錯誤14350( http://www.mail- archive.com/llvmbugs@cs.uiuc.edu/msg21095.html )。 那么,這里的clang和intel錯誤嗎?

14.6.1說:

注入的類名稱可以用作模板名稱類型名稱 當它被用來與模板參數列表 ,作為模板參數的模板的模板參數 ,或者如在一個朋友類模板聲明的闡述型說明符的最后標識,它指的是類模板本身。

“ injected-class-name”是“注入”到類范圍內的類模板( B )的名稱。 換句話說,它指的是在類B的定義中使用不合格的名稱B 如果在需要模板名稱的上下文中使用該名稱:即使用顯式模板參數( B<int> )或作為采用模板模板參數( A<B> )的模板的模板參數,則應請參閱模板本身。

因此,gcc是正確的。

同樣,在C ++ 11中,您在< in <::B>中的<::B>之后不需要空格。 根據2.5節第3段,在將輸入流划分為令牌時:

如果接下來的三個字符是<:: ,后一個字符既不是:也不是> ,則<本身被視為預處理器令牌,而不是替代令牌<:的第一個字符。 <:是另一種寫[ 。的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM