如何声明一个模板类(组件库),它将包含组件的向量作为参数? 以下是代码的精简版本:
// 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;
主要使用相同的模板。
谢谢,非常感谢任何帮助
答案 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_));
}
[...]
};
这适用于vector
,list
以及可以“back_inserted”的所有内容。此外,您可以通过container_type
和value_type
实例声明为
Library<std::vector<int> > lib(someInitializer);