【发布时间】:2017-05-13 18:23:26
【问题描述】:
我正在创建一个 Multistack 类,应该使用以下任一方法调用:
Multistack<type>
或
Multistack<type, container>
例如
Multistack<int, vector>
下面是我的代码:
#include <vector>
#include <deque>
#include <list>
using namespace std;
template <typename T, template <typename> class Cont>
class Multistack {
public:
// Member functions
private:
Cont<T> _elems;
};
int main(int argc, char** argv){
Multistack<int, vector> ms;
return 0;
}
但是,我收到以下错误:
main9.cpp: In function ‘int main(int, char**)’:
main9.cpp:18:27: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, template<class> class Cont> class Multistack’
Multistack<int, vector> ms;
^
main9.cpp:18:27: note: expected a template of type ‘template<class> class Cont’, got ‘template<class _Tp, class _Alloc> class std::vector’
main9.cpp:18:29: warning: unused variable ‘ms’ [-Wunused-variable]
Multistack<int, vector> ms;
我发现了类似的问题,但似乎没有一个解决方案可以解决我的问题。
【问题讨论】:
-
Multistack需要一个单参数类模板作为其第二个参数。std::vector是一个双参数模板。只需将类型作为第二个参数(而不是模板),然后传递std::vector<int> -
@Igor Tandetnik:哦,你知道模板中的正确语法,以便能够传递
std::vector吗?问题是,我希望第一个参数定义类型,第二个参数定义容器。所以调用我的构造函数的语法应该是Multistack<int, std::vector>. -
好吧,具体来说,对于
std::vector,您可以使用template <typename, typename> class Cont,并将其用作Cont<T, std::allocator<T>>。虽然如果你设计的类几乎只适用于std::vector,那么为什么还要费心接受参数呢? -
如果你可以使用C++11(或更高版本),你可以将
Cont定义为template <typename...> class;仅将其定义为template <typename, typename> class,您仅拦截vector、deque、list、forward_list、stack和queue;使用typename...,您还可以拦截set、multiset、map、multimap、unordered_set、unordered_multiset、unordered_map、unordered_multimap和priority_queue。但你不拦截(typename, typename或typename...)array
标签: c++ templates template-templates