C++中能否将容器模板作为模板函数的typename参数传递
问题解答
错误原因
你的代码编译报错主要有两个原因:
- 模板参数
T被声明为普通typename(表示普通类型),无法直接作为模板添加<int>进行实例化,编译器自然会提示「T不是模板」 - 函数名拼写不一致:定义的函数名为
find_size,调用时写的是findsize,也会触发编译错误
核心问题回复
可以将容器模板传入函数模板,需要使用模板模板参数语法声明模板参数,也可以用更简单的通用类型模板参数实现需求,两种常用实现方案如下:
方案1:通用类型模板参数(兼容性最好,C++11及以上可用)
不需要显式接收模板作为参数,直接将完整容器类型作为模板参数即可,这种写法适配所有标准容器,不需要考虑容器的模板参数数量差异:
#include <array> #include <type_traits> template <typename T> int find_size(const T& t) // 传const引用避免容器拷贝开销 { // 如果需要强制限定容器存储的是int类型,可以加静态校验,不需要可以删掉 static_assert(std::is_same_v<typename T::value_type, int>, "仅支持存储int的容器"); return t.size(); } int main(void) { std::array<int, 10> test; for (int i = 0; i < 10; i++) { test[i] = i; } find_size(test); // 函数名和定义保持一致 return 0; }
方案2:模板模板参数(符合你最初的实现思路,C++17及以上可用)
显式声明模板参数为模板类型,匹配你要传入容器模板的需求:
#include <array> // 声明T是一个模板,第一个参数为类型,后续支持任意数量参数 template <template <typename, auto...> typename T> int find_size(const T<int>& t) { return t.size(); } int main(void) { std::array<int, 10> test; for (int i = 0; i < 10; i++) { test[i] = i; } find_size(test); return 0; }
内容的提问来源于stack exchange,提问作者user12356071
相关产品推荐
相关产品推荐

