c++ - 如何创建以不同对象的模板容器为参数的模板类

标签 c++ templates vector template-templates

我如何声明一个模板类(一个组件库),它将一个包含组件的 vector 作为参数? 这是一个精简版的代码示例:

    // In Library.h
    using namespace std;

    template<typename T,
        template <typename, typename = std:allocator<T>> class Container>
    class library {
        Container<T> comp_lib;
        library(Container<T> &Vc) {comp_lib = Vc}
    };

    // In mainProgram.cpp
    #include "Library.h"
    // Other includes...
    using namespace std;

    int main() {
    library<int, vector> intLib;
    return(0);
    }

正如我之前提到的,这是一个组件库。因此,库模板不是保存包含整数的 vector ,而是保存包含一般组件的 vector 、包含电阻器的 vector 、包含电容器的 vector 和包含电感器的 vector 。其中电阻器、电容器和电感器都是组件基类的派生类。

当我运行代码时,它没有编译并且我收到这些错误消息:

C2079:“intLib”在 mainProgram.cpp 中的行 [library intLib] 上使用未定义的类“library”

C3855 'library': 模板参数 'C' 与声明不兼容 在线的 [ }; ] 在library.h中(最后一行)

C3855 'library': 模板参数 'vector' 与行 [ } 上的声明不兼容; ] 在 library.h 中(也是最后一行)

我看了很多关于模板模板参数的不同文章,这个答案到目前为止特别有用,尽管它似乎没有解决我目前遇到的问题: Template class with template container

期望的结果是能够编写如下语句:

      library<resistor, vector<resistor>> resistor_lib;
      library<capacitor, vector<capacitor>> capacitor_lib;
      library<inductor, vector<inductor>> inductor_lib;
      library<component, vector<component>> component_lib;

主要都使用相同的模板。

谢谢,非常感谢任何帮助

最佳答案

您只需要对容器进行模板化,然后让它告诉存储的类型。标准容器通过 value_type 定义来做到这一点。做这样的事情:

template <typename TContainer>
class Library {
private:

    TContainer container_;

public:

    using container_type = TContainer;
    using value_type = typename TContainer::value_type;

    Library(const container_type &initValues) {
        std::copy(initValues.begin(), initValues.end(),
            std::back_inserter(container_));
    }

    [...]
};

这应该适用于 vectorlist 和所有可以“back_inserted”的东西。此外,您可以通过 container_typevalue_type 引用容器和对象类型。

实例声明为

Library<std::vector<int> > lib(someInitializer);

关于c++ - 如何创建以不同对象的模板容器为参数的模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43241704/

相关文章:

c++ - 错误: passing x as 'this' argument of x discards qualifiers

c++ - 扩展 Protocol Buffer

c++ - 类型特征 C++ 的错误/错误使用

node.js - 是否可以使用 PhantomJS 和 Node 从模板动态生成 PDF?

c++ - 派生类型的自动静态调用

c++ - 对 const c 数组拷贝的结构化绑定(bind)应该是 const 吗?

c++ - 使用 double 时精度损失

c++ - 创建恒定大小 vector 的恒定大小 vector

c++ - 从 std::vector 获取特定结构对象的快速方法

c++ - 如何在 C++ 中将 vector<int> 连接到单个 int?