当在模板中使用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
};在我看来,这似乎是语言中的一个漏洞,仅仅是因为使用声明语法生成没有包含限定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,:: template-id,以及template关键字,该关键字已经有足够的规范来修补漏洞。这个分析正确吗?
考虑到允许使用新语法,也许带有typename的声明应该导入类模板或别名模板,而没有typename的声明应该将函数或变量模板导入当前范围。
using typename derived::base::template ct;
using derived::base::ft;这可能需要一些额外的规范。而且,当前的现状似乎是依赖的模板名称总是有不明确的类型(不是模板ids),因此还不清楚typename是否属于ct。
发布于 2013-03-17 11:26:26
以下内容在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吗?
https://stackoverflow.com/questions/15423283
复制相似问题