传递类模板作为模板参数时出现编译错误
问题: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
相关产品推荐
相关产品推荐

