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

传递类模板作为模板参数时出现编译错误

问题:C++模板工厂函数编译失败分析与修复

原代码如下:

#include <type_traits>

template <typename T>
class myTemplateClass
{
public:
    myTemplateClass(T t)
        : val{t}
    {}
    T val;
};

template <template<typename> class TT, typename T>
auto create(T val)
requires std::is_same_v<TT<T>, myTemplateClass<T>>
{
    return TT<T>(val);
};


int main()
{
    auto result =  create<myTemplateClass<int>>(10);
    // or
    auto result = create(static_cast<int>(10));
}

两次create函数调用均编译失败:

第一次调用的MSVC错误:

error C2672: 'create': 找不到匹配的重载函数

error C3207: 'create': 模板参数'TT'无效,应为类模板

第二次调用的MSVC错误:

error C2672: 'create': 找不到匹配的重载函数

error C2783: 'auto create(T)': 无法推导模板参数'TT'

期望实现的目标是让以下代码能够正常编译:

auto result = create(static_cast<int>(10));

问题原因与修复方案

第一次调用失败原因

create的第一个模板参数要求是类模板(template<typename> class TT),但传入的myTemplateClass<int>是实例化后的具体类,不是类模板本身。正确写法应为传入类模板myTemplateClass,并指定第二个模板参数int:

auto result = create<myTemplateClass, int>(10);

第二次调用失败原因

编译器无法从函数参数推导类模板参数TT,因为参数中没有关联TT的信息。要实现仅传入int值就创建myTemplateClass<int>,可调整create的设计:

方案一:给TT设置默认模板参数,固定为myTemplateClass

template <typename T, template<typename> class TT = myTemplateClass>
auto create(T val)
requires std::is_same_v<TT<T>, myTemplateClass<T>>
{
    return TT<T>(val);
};

此时调用create(static_cast<int>(10)),编译器会自动推导T=int,并使用默认的TT=myTemplateClass,满足需求。

方案二:若不需要requires约束,可直接简化代码

template <typename T>
auto create(T val)
{
    return myTemplateClass<T>(val);
};

该写法更直接,完全支持你期望的调用方式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:35:27