You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:36:00