提问人:Anton Tretyakov 提问时间:9/16/2022 更新时间:9/16/2022 访问量:120
C++ - 将标准容器作为模板模板参数传递
c++ - passing standard container as a template template parameter
问:
因此,我需要创建一个 mixin 类来封装某个派生类的子类。派生类应继承自 mixin,同时提供容器模板作为 mixin 的模板模板参数。
所需的代码有点像这样:
/*template definition*/
template<template<typename T, typename A> class C>
class HasChildren {
protected:
C<T, A> m_children;
/* whatever */
};
它有一系列问题:
- 当尝试实例化这个类时,就像(仅用于测试)时,编译器说。显然,我没有传递模板模板。我想知道我到底想传递什么。
HasChildren<std::vector<int>>
expected a class template, got ‘std::vector<int>’
- 因为编译器说,并且超出了范围。当我为它们添加关键字时,错误更改为 .我想知道为什么
T
和A
超出了范围,以及为什么添加typename
会导致此错误。C<T, A> m_children;
T
A
typename
error: wrong number of template arguments (1, should be 2)
答:
2赞
Ted Lyngmo
9/16/2022
#1
- 传递一个类型 ,而不是一个模板 。
std::vector<int>
std::vector
- 您还需要接受模板模板参数。 不使模板模板使用 和 。它们仅用于文档,可以删除。
template<typename T, typename A>
T
A
例:
template <template <class, class> class C, class T, class A>
// ^^^^^^^ ^^^^^^^
class HasChildren {
protected:
C<T, A> m_children;
};
int main() {
HasChildren<std::vector, int, std::allocator<int>> hc;
// ^template^ ^-----parameters-------^
}
如果您更喜欢像最初尝试的那样进行实例化,请使用 ,您可以通过专门化:HasChildren
HasChildren<std::vector<int>>
HasChildren
template<class> class HasChildren; // primary
// specialization:
template<template <class, class> class C, class T, class A>
class HasChildren<C<T,A>> {
protected:
C<T,A> m_children;
};
int main() {
HasChildren<std::vector<int>> hc;
}
评论
0赞
Anton Tretyakov
9/16/2022
啊,我明白了,谢谢你!但是,为了明确起见,为什么确切地和超出了范围?我认为模板范围以其定义的右括号结尾,其中有一个定义。T
A
HasChildren
1赞
Ted Lyngmo
9/16/2022
@AntonTretyakov 不客气。 在您的示例中不是模板模板的参数。它们仅供代码的读者使用,以便更轻松地查看所采用的两个模板参数将映射到什么。 只有一个参数 (the ),即使它看起来像 3。T
A
C
template<template<typename T, typename A> class C>
template C
1赞
Ted Lyngmo
9/16/2022
@AntonTretyakov 你的意思是你尝试并在那行上遇到了那个错误?如果是这样,那么,我发现这个错误令人困惑,但至少它给出了一个错误,因为它应该只接受一个模板参数,既不接受,也不是 - 只有。C<typename T, typename A> m_children;
HasChildren
T
A
C
1赞
Ted Lyngmo
9/16/2022
@AntonTretyakov 不客气。如果您愿意,我添加了一个替代方案。HasChildren<std::vector<int>> hc;
1赞
Ted Lyngmo
9/16/2022
@AntonTretyakov干杯!当我写的东西有帮助时,总是很高兴!:-)
评论
std::vector
std::vector<int>
C<...>
typename C
std::vector
HasChildren
m_children
<typename...>
typename