在下面的代码片段中:
#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(){}标记的行很难看,而且还包含重复的信息(如果基类参数的类型发生变化,则此行也必须更改)。
有没有引用依赖于模板的基类中定义的类型的解决方案?
发布于 2016-10-05 04:39:30
您可以将容器类型作为模板参数进行传递:
template<class T, class C = std::map<int,std::map<int,T>>>
struct Derived: public Base<C> {
typedef typename Base<C>::U U;
//...
};另外,同样的事情也可以在基类中完成。
发布于 2016-10-05 05:11:11
如果您至少可以使用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也被using声明所取代。
发布于 2016-10-05 06:08:35
问题是非限定名称查找不会查看依赖的基类。因此,只需限定名称并告诉编译器U将成为Derived的成员
void F(typename Derived::U u) {}如果你讨厌一遍又一遍地写出整个东西,那就使用一个新的成员别名:
using DU = typename Derived::U; // or typedef equivalenthttps://stackoverflow.com/questions/39861299
复制相似问题