无法推导模板参数是否需显式指定?C++模板问题咨询
模板参数推导问题解答
代码示例
template <int I, typename T> struct Wrap { T internal; }; template <int I, typename T> Wrap<I, T> DoStuff(int z) { return Wrap<I, T>{(T)z}; } class Wrapped { public: // Working Wrap<1, int> GetInt() { return DoStuff<1, int>(1); } Wrap<2, long> GetLong() { return DoStuff<2, long>(2); } // Not working Wrap<3, char> GetChar() { return DoStuff(3); } };
用户疑问
第三个函数为何无法解析模板参数?原以为编译器会根据函数返回类型匹配模板定义,该特性在C++14或更高版本中是否可行?
解答
C函数模板的参数推导仅基于函数的实参,完全不会考虑返回值类型——这个规则在C14、C17乃至C20等所有版本中都没有改变。
对于DoStuff模板函数,它包含两个模板参数:非类型模板参数int I和类型模板参数T。调用DoStuff(3)时,编译器只能获取到实参3,但这个实参既无法推导I(I是独立的模板参数,和函数参数z没有绑定关系),也无法推导T(返回值类型不参与推导逻辑),因此编译器无法确定模板参数的具体值,导致编译失败。
要修复这个问题,有两种常见思路:
- 显式指定模板参数,和前两个函数保持一致:
return DoStuff<3, char>(3); - 调整模板设计,让模板参数能通过实参推导出来,比如将函数参数类型改为
T(需结合实际需求调整)
内容的提问来源于stack exchange,提问作者G B
相关产品推荐
相关产品推荐

