簡體   English   中英

對類型相關的模板名稱使用聲明

[英]Using declaration for type-dependent template name

當在模板內部使用CRTP時(或者通常在將模板參數作為基類模板參數傳遞時),是否不可能在using聲明中命名基類的成員模板?

template< typename d >
struct base {
    template< typename >
    struct ct {};

    template< typename >
    void ft() {}
};

template< typename x >
struct derived : base< derived< x > > {
     using derived::base::template ct; // doesn't work
     using derived::base::ft; // works but can't be used in a template-id
};

在我看來,這只是語言上的一個空洞,僅僅是因為use-declaration語法生成中沒有包含qualified-id

using-declaration:
    using typename(opt) nested-name-specifier unqualified-id ; // have this
    using :: unqualified-id ;

unqualified-id:
    identifier
    operator-function-id
    conversion-function-id
    literal-operator-id
    ~ class-name
    ~ decltype-specifier
    template-id

qualified-id:
    nested-name-specifier template(opt) unqualified-id // want this
    :: identifier
    :: operator-function-id
    :: literal-operator-id
    :: template-id

如果唯一的規則是using-declaration: using typename(opt) qualified-id ,唯一的后果是

  • 排除:: conversion-function-id:: ~ class-name :: ~ decltype-specifier template-id :: ~ class-name:: ~ decltype-specifier template-id ,它們沒有語義上的意義,
  • 允許:: template-id已被7.3.3 / 5明確禁止,並且
  • 允許已有足夠規格的template關鍵字修補該孔。

這種分析正確嗎?

考慮到允許使用新的語法,也許使用typename的聲明應該導入一個類模板或別名模板,而沒有typename應該將一個函數或變量模板導入當前作用域。

     using typename derived::base::template ct;
     using derived::base::ft;

這可能需要一些其他規范。 此外,目前的現狀似乎是依賴模板的名稱總是有那種曖昧(不是模板-IDS),所以目前尚不清楚, typename屬於與ct的。

以下在C ++ 11上正常工作:

#include <iostream>

template< typename d >
struct base {
    template< typename >
    struct ct {};

    template< typename >
    void ft() {std::cerr << "cheesecake" << std::endl;}
};

template< typename x >
struct derived : base< derived< x > > {
  template<typename X>
    using ct = typename derived::base::template ct<X>; // new in C++11
  using derived::base::ft;
};

int main()
{
  derived<int>::ct<float> c;
  derived<int> a;
  a.ft<int>();
}

如果那不是您想要的,可以請舉例說明如何使用ctft嗎?

暫無
暫無

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

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