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

C++中如何将未特化的容器类作为模板参数传入自定义struct?

问题原因
  • 你定义的第二个模板参数Container属于普通类型模板参数,只能接收具体类型入参,但你传入的std::vector是未完成实例化的模板,不是具体类型,必须声明为模板模板参数才能支持这种入参。
  • 修改后的struct定义末尾遗漏了分号,属于语法错误,也会导致编译失败。
正确实现方案

方案1:使用模板模板参数(C++17及以上推荐)

这种写法和你预期的调用方式完全一致,不需要修改实例化代码:

#include <vector>
#include <memory>
using namespace std;

// 声明Container为模板模板参数,适配标准容器的默认参数
template <typename T, template <typename, typename...> typename Container> 
struct myclass {
  T value;
  Container<unique_ptr<myclass<T>>> children;
};

// 调用方式和你写的完全一致
myclass<int, vector> x;

代码说明:模板模板参数声明里的可变参数包typename...用于匹配标准库容器自带的默认分配器、排序规则等隐式模板参数,不需要你手动显式传入。

方案2:传入完整特化容器类型(全版本C++兼容)

如果需要兼容C++11/14等旧标准,可以直接传入实例化完成的容器类型作为参数:

#include <vector>
#include <memory>
using namespace std;

template <typename T, typename Container> 
struct myclass {
  T value;
  Container children;
};

// 实例化时传入完整的容器类型
using MyIntVecClass = myclass<int, vector<unique_ptr<myclass<int, vector<unique_ptr<myclass<int>>>>>>>;
MyIntVecClass x;

如果觉得实例化写法太冗长,可以用别名模板简化调用:

template <typename T, template <typename, typename...> typename Container>
using MyClass = myclass<T, Container<unique_ptr<myclass<T, Container>>>>;

// 简化后的调用方式和方案1一致
MyClass<int, vector> x;

内容的提问来源于stack exchange,提问作者thc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:06:03