首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引用依赖的typename

引用依赖的typename
EN

Stack Overflow用户
提问于 2016-10-05 04:35:54
回答 3查看 70关注 0票数 3

在下面的代码片段中:

代码语言:javascript
复制
#include <map>

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

template<class T>
struct Derived: public Base<std::map<int,std::map<int,T>>> {
  typedef typename Base<std::map<int,std::map<int,T>>>::U U; // ugly!

  void F(U u) {};
};

int main(){}

标记的行很难看,而且还包含重复的信息(如果基类参数的类型发生变化,则此行也必须更改)。

有没有引用依赖于模板的基类中定义的类型的解决方案?

EN

回答 3

Stack Overflow用户

发布于 2016-10-05 04:39:30

您可以将容器类型作为模板参数进行传递:

代码语言:javascript
复制
template<class T, class C = std::map<int,std::map<int,T>>>
struct Derived: public Base<C> {
  typedef typename Base<C>::U U;
//...
};

另外,同样的事情也可以在基类中完成。

票数 4
EN

Stack Overflow用户

发布于 2016-10-05 05:11:11

如果您至少可以使用C++11,则可以将函数声明(这里不需要定义)和using声明组合在一起,如下所示:

代码语言:javascript
复制
#include <map>
#include<utility>

template<class T>
struct Base {
  using U = T;
};

template<typename T>
typename Base<T>::U f(Base<T>);

template<typename T>
using BType = decltype(f(std::declval<T>()));

template<class T>
struct Derived: public Base<std::map<int,std::map<int,T>>> {
  using U = BType<Derived>;
  void F(U u) {};
};

int main(){}

还要注意的是,typedef也被using声明所取代。

票数 3
EN

Stack Overflow用户

发布于 2016-10-05 06:08:35

问题是非限定名称查找不会查看依赖的基类。因此,只需限定名称并告诉编译器U将成为Derived的成员

代码语言:javascript
复制
void F(typename Derived::U u) {}

如果你讨厌一遍又一遍地写出整个东西,那就使用一个新的成员别名:

代码语言:javascript
复制
using DU = typename Derived::U; // or typedef equivalent
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39861299

复制
相关文章

相似问题

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