【问题标题】:How to create a template class with a template container of different objects as a parameter如何以不同对象的模板容器作为参数创建模板类
【发布时间】:2017-04-05 21:11:52
【问题描述】:

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

    // 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:'intLib' 在 mainProgram.cpp 的 [ library intLib ] 行上使用未定义的类 'library'

C3855“库”:模板参数“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;

主要都是使用相同的模板。

谢谢,非常感谢任何帮助

【问题讨论】:

  • 你没有默认构造函数,也没有公共构造函数。
  • 是的,抱歉,忘记将构造函数添加到示例中。这只是一个非常精简的代码,试图说明问题而不会太复杂。原始代码确实具有公共默认和参数化构造函数,但仍然无法编译

标签: c++ templates vector template-templates


【解决方案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);

【讨论】:

  • std 容器是可复制构造的。您可以在库的构造函数初始化列表中复制初始化 container_
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 2015-06-08
  • 2020-03-26
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
相关资源
最近更新 更多