[英]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.