如何使用不同对象的模板容器创建模板类作为参数

时间:2017-04-05 21:11:53

标签: c++ templates vector multiple-files template-templates

如何声明一个模板类(组件库),它将包含组件的向量作为参数? 以下是代码的精简版本:

    // 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);
    }

正如我之前提到的,这是一个组件库。因此,库模板不是保持包含整数的向量,而是用于保存包含通用组件的向量,包含电阻器的向量,包含电容器的向量和包含电感器的向量。电阻器,电容器和电感器都是元件基类的派生类。

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

C2079:&#39; intLib&#39;使用未定义的类&#39;库&#39;在mainProgram.cpp

中的[library intLib]行上

C3855&#39;图书馆&#39;:模板参数&#39; C&#39;与声明不符 在线[}; ]在library.h(最后一行)

C3855&#39;库&#39 ;:模板参数&#39; vector&#39;与第[...]行的声明不相容; ]在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;

主要使用相同的模板。

谢谢,非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

您只需要对容器进行模板化,然后让它告诉存储的类型。标准容器通过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);