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

How to create a template class with a template container of different objects as a parameter

本文关键字:参数 创建 建模 对象 何使用      更新时间:2023-10-16

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

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

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

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

我已经看了很多关于模板模板参数的不同文章,到目前为止,这个答案特别有用,尽管它似乎没有解决我目前遇到的问题: 具有模板容器的模板类

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

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