簡體   English   中英

從依賴基類訪問類型

[英]Accessing types from dependent base classes

有誰知道為什么使用聲明似乎不適用於從依賴基類導入類型名稱? 它們適用於成員變量和函數,但至少在GCC 4.3中,它們似乎被忽略了類型。

template <class T>
struct Base
{
  typedef T value_type;
};

template <class T>
struct Derived : Base<T>
{
  // Version 1: error on conforming compilers
  value_type get();

  // Version 2: OK, but unwieldy for repeated references
  typename Base<T>::value_type get();

  // Version 3: OK, but unwieldy for many types or deep inheritance
  typedef typename Base<T>::value_type value_type;
  value_type get();

  // Version 4: why doesn't this work?
  using typename Base<T>::value_type;
  value_type get(); // GCC: `value_type' is not a type
};

我有一個基類,有一組allocator樣式的typedef,我想在幾個繼承級別繼承。 到目前為止,我發現的最佳解決方案是上面的版本3,但我很好奇為什么版本4似乎不起作用。 GCC接受使用聲明,但似乎忽略它。

我檢查了C ++標准,C ++程序。 郎。 第3版。 [Stroustrup]和C ++模板[Vandevoorde,Josuttis],但似乎都沒有解決使用聲明是否可以應用於依賴基類類型。

如果它有助於查看另一個示例, 這里是在GCC郵件列表中被問到但沒有真正回答的相同問題 提問者表示他已在其他地方看到“使用typename”,但GCC似乎並不支持它。 我沒有其他符合標准的編譯器可用於測試它。

正如Richard Corden所指出的那樣,在2003標准被批准之后,這個問題在C ++標准核心語言缺陷報告中得到了解決: 關鍵字typename / template如何與using-declarations交互?

擬議決議(2003年4月,2003年10月修訂):

在7.3.3 [namespace.udecl]的底部添加一個新段落:

如果using聲明使用關鍵字typename並指定依賴名稱(14.7.2 [temp.dep]),則using-declaration引入的名稱將被視為typedef-name(7.1.3 [dcl.typedef]) 。

該文本似乎沒有出現在2003年10月15日的第二版標准中。

GCC尚未實施此解決方案,如錯誤14258中所述

-------評論#3來自Giovanni Bajo 2004-02-27 12:47 [回復] -------問題是我們的USING_DECL沒有記錄“typename”,這就是事實它是一種通過它導入的類型。 我相信這可以歸功於隱式類型名稱擴展。

重復錯誤21484表示'using typename'適用於Comeau和Intel編譯器。 因為MSVC將所有名稱視為依賴,所以該編譯器不需要(但允許)該構造。


已於2011年12月13日在GCC 4.7中修復

在為Base :: value_type聲明typedef之前,您沒有在Base的模板中包含訪問說明符(public / protected / private)。 因此,它默認為private,並且在從Base派生的類中不可訪問。

暫無
暫無

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

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