[英]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>();
}
如果那不是您想要的,可以請舉例說明如何使用ct和ft嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.