引用依赖的类型名
refer to a dependent typename
在以下代码片段中:
#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(){}
标记的行是丑陋的,还包含重复的信息(如果基类参数的类型改变,这一行也必须改变)。然而,有必要重复这样的声明,否则代码将无法编译。此外,我想避免做一个全局类型定义声明…
是否有一个解决方案来引用在模板依赖基类中定义的类型?
可以将容器类型作为模板参数:
template<class T, class C = std::map<int,std::map<int,T>>>
struct Derived: public Base<C> {
typedef typename Base<C>::U U;
//...
};
注:
如果你至少使用c++ 11,你可以组合一个函数声明(这里不需要定义)和using声明,如下所示:
#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
s也已被using声明所取代。
问题是非限定名称查找不查找依赖的基类。所以只要限定名称并告诉编译器U
将是Derived
的成员:
void F(typename Derived::U u) {}
如果你不愿意一次又一次地写出所有的东西,那么使用一个新的成员别名:
using DU = typename Derived::U; // or typedef equivalent
相关文章:
- 如何从C++中的依赖类型中获得它所依赖的类型
- 将依赖名称显式标记为类型名和模板的奇怪之处
- 当基类是依赖类型时,这是一个缺陷吗
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 为什么依赖模板类型在部分专用化中不可推导?
- 为什么即使直到最后才定义实际类型,也可以将依赖名称视为完整
- 为什么不需要在 C++20 中的依赖类型之前指定"typename"?
- 如何使用类型专用化模板方法,该类型本身就是一个模板,其中只有返回类型依赖于模板类型
- 类型依赖于可变参数模板的类
- 类型依赖模板名称
- 模板类型依赖和继承
- C++中的循环类型依赖项死锁
- c++ 中带有容器迭代器的循环类型依赖关系(GCC 失败,而 MSVC 正常)
- C++使变量类型依赖于用户输入
- 使返回类型依赖于调用源
- 如何专用化基于类型依赖类型的C++模板化类函数
- 将 POD 联合双关到基本类型:依赖于实现或符合标准
- 使用类型依赖模板名的声明
- 非类型模板参数,其类型依赖于另一个参数