【问题标题】:template-template parameter giving mysterious type/value mismatch模板模板参数给出神秘的类型/值不匹配
【发布时间】: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&lt;int&gt;
  • @Igor Tandetnik:哦,你知道模板中的正确语法,以便能够传递std::vector吗?问题是,我希望第一个参数定义类型,第二个参数定义容器。所以调用我的构造函数的语法应该是Multistack&lt;int, std::vector&gt;.
  • 好吧,具体来说,对于std::vector,您可以使用template &lt;typename, typename&gt; class Cont,并将其用作Cont&lt;T, std::allocator&lt;T&gt;&gt;。虽然如果你设计的类几乎只适用于std::vector,那么为什么还要费心接受参数呢?
  • 如果你可以使用C++11(或更高版本),你可以将Cont定义为template &lt;typename...&gt; class;仅将其定义为template &lt;typename, typename&gt; 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


【解决方案1】:

std::vector 的声明是:

template<
    class T,
    class Allocator = std::allocator<T>
> class vector;

与模板模板参数template&lt;typename&gt; class Cont不匹配。

改用以下内容:

template <typename T, template <typename...> class Cont>
class Multistack {
    // ...
};

这将使您有机会使用std::vector、std::list 和其他具有两个模板参数的容器以及诸如std::set 和std::priority_queue 等具有三个或更多模板参数的容器。当然,也可以接受只有一个模板参数的自定义容器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多