C++中接收模板类实例为参数的测试类正确语法求教
正确实现方案
你预期的用法是直接把实例化后的数据结构类型作为唯一模板参数传入Testobject,共有两种可行的实现方式,分别对应不同的使用场景:
方案1:单类型参数模板(完全匹配你的预期用法)
这种写法不需要拆分容器和元素类型,和你给出的调用示例100%适配:
template <typename T> class Testobject { public: Testobject() = default; // 可在此处添加通用测试方法,比如增删操作校验、容量测试等 void test_push(const typename T::value_type& val) { data.push_back(val); } private: T data; };
用法验证:
// DatastructType1<int> 是你已经实例化好的int型数据结构 Testobject<DatastructType1<int>> obj = Testobject<DatastructType1<int>>(); // DatastructType2<float> 是你已经实例化好的float型数据结构 Testobject<DatastructType2<float>> obj2 = Testobject<DatastructType2<float>>();
该方案兼容性最强,哪怕你的数据结构有多个模板参数(比如自定义了分配器、比较器参数),都可以直接传入,不需要修改Testobject的模板声明。
方案2:模板模板参数(拆分容器和元素类型)
如果你需要在测试类内部直接获取元素类型做特殊逻辑处理,可以使用你尝试过的模板模板参数写法,C++17及以上版本可以用typename代替class声明模板模板参数:
// 模板参数说明: // T:接收未实例化的数据结构模板(如DatastructType1、DatastructType2) // U:接收数据结构存储的元素类型(如int、float) template <template <typename> typename T, typename U> class Testobject { public: Testobject() = default; private: T<U> data; };
对应用法:
需要分开传入数据结构模板和元素类型,和你原来的示例写法略有区别:
Testobject<DatastructType1, int> obj; Testobject<DatastructType2, float> obj2;
你之前尝试的写法问题说明
template <typename T <typename U>>:语法不合法,C++标准不支持这种嵌套的模板参数声明写法template <typename T, template <typename> class U>>:参数顺序逻辑颠倒,且你传入的第一个参数是已经实例化的容器类型,无法匹配模板模板参数U的要求template <template <typename T> class U>:只声明了模板模板参数,缺少元素类型参数,无法完成U<T>类型成员变量的实例化
内容的提问来源于stack exchange,提问作者Deepflea18
相关产品推荐
相关产品推荐

