首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对类型相关的模板名称使用声明

对类型相关的模板名称使用声明
EN

Stack Overflow用户
提问于 2013-03-15 01:38:22
回答 1查看 3.3K关注 0票数 16

当在模板中使用CRTP时(或者通常当模板参数作为基类模板参数传递时),是否不可能在using声明中命名基成员模板?

代码语言:javascript
复制
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。

代码语言:javascript
复制
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
  • 允许已被7.3.3/5明文禁止的:: template-id,以及
  • 允许template关键字,该关键字已经有足够的规范来修补漏洞。

这个分析正确吗?

考虑到允许使用新语法,也许带有typename的声明应该导入类模板或别名模板,而没有typename的声明应该将函数或变量模板导入当前范围。

代码语言:javascript
复制
     using typename derived::base::template ct;
     using derived::base::ft;

这可能需要一些额外的规范。而且,当前的现状似乎是依赖的模板名称总是有不明确的类型(不是模板ids),因此还不清楚typename是否属于ct

EN

回答 1

Stack Overflow用户

发布于 2013-03-17 11:26:26

以下内容在C++11中运行得很好:

代码语言:javascript
复制
#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吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15423283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档