我如何声明一个模板类(一个组件库),它将一个包含组件的 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_));
}
[...]
};
这应该适用于 vector
、list
和所有可以“back_inserted”的东西。此外,您可以通过 container_type
和 value_type
引用容器和对象类型。
实例声明为
Library<std::vector<int> > lib(someInitializer);
关于c++ - 如何创建以不同对象的模板容器为参数的模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43241704/