我希望从一个使用基于第一个类的模板的另一个类中获取类模板的类型名称。
我已经编写了以下类:
template<typename T>
class class_a {
...
}
我希望做一些事情:
template<class class_a>
class class_b {
std::vector<class_a.T> arr;
...
}
最简单的方法是使您的模板相互“协作”,并且class_a
能够“帮助”其他模板:
template<typename T>
class class_a {
public:
typename T type_t;
};
然后:
template<class class_a>
class class_b {
std::vector<typename class_a::type_t> arr;
...
};
在C++库本身中,您会发现这是一种相当标准的设计模式。例如,大多数C++容器定义了value_type
,因此如果我们将typedef
更改为value_type
:
template<typename T>
class class_a {
public:
typename T value_type;
};
接下来:
template<class class_a>
class class_b {
std::vector<typename class_a::value_type> arr;
...
};
如果你使用std::list
来实例化你的class_b
,例如:
class_b<std::list<char>> b;
那么你的arr
最终会变成std::vector<char>
。
另一种不需要这种"协作"的替代方法是使用一个具有特化的辅助模板,以避免显式声明typedef
别名。但是,除非你有某些特定的原因不采用这种方式,否则这是最简单的解决方案。
typename T type_t;
,不如采用现代的类型别名形式 using type_t = T;
。 - Martin Yorktype_t
还是 value_type
,都会出现这个错误:error: expected nested-name-specifier before ‘T’
。 - th3g3ntl3mantype_t
或 value_type
”,也不知道哪一行代码导致了错误。这是非常基础的内容,在您的C++教材中应该有很多类似的示例供您模仿。 - Sam Varshavchik
std::vector::value_type
。 - Cássio Renan