C++无参数模板参数包展开报错C2672,求问题原因及解决办法
解决VC141下模板参数包展开的C2672错误
常见错误原因及修正方案
1. 模板参数包声明顺序错误
VC141对模板参数包的语法要求严格,必须写成typename... Ts(省略号在typename之后、参数名之前),如果写反成typename Ts...,编译器会无法识别参数包,导致找不到匹配的函数模板。
错误写法:
// 错误:参数包声明顺序颠倒 template<typename Ts...> void print_types() { /* ... */ }
正确写法:
template<typename... Ts> void print_types() { /* ... */ }
2. 缺少空参数包的终止函数(递归展开场景)
如果用递归方式展开参数包,必须提供空参数包对应的重载,否则递归到最后一步时,编译器找不到匹配的print_types<>(),触发C2672。
错误写法:
template<typename T, typename... Ts> void print_types() { using namespace boost::typeindex; std::cout << type_id_with_cvr<T>().pretty_name() << " "; print_types<Ts...>(); // 最后一步找不到print_types<>() }
正确写法:
// 递归展开函数 template<typename T, typename... Ts> void print_types() { using namespace boost::typeindex; std::cout << type_id_with_cvr<T>().pretty_name() << " "; print_types<Ts...>(); } // 空参数包的终止重载 void print_types() { std::cout << "\n"; }
3. 调用方式错误(未显式指定模板参数)
改为直接传递类型模板参数后,调用时必须用print_types<Type1, Type2>()的形式显式指定类型,不能像参数推导版本那样传实例。如果写成print_types(cDog{})或者print_types(cDog),编译器会尝试推导参数,但函数模板不需要实参,因此找不到匹配签名。
错误调用:
print_types(cDog{}); // 试图传递实例,不符合无参模板函数的签名
正确调用:
print_types<cDog, int, std::string>(); // 显式指定模板类型参数
4. C++标准版本未正确设置
如果使用C17的折叠表达式(如((std::cout << ...), ...)),VC141需要显式开启C17支持(在VS项目属性中设置为C17标准)。如果默认用C14,折叠表达式会被视为语法错误,间接导致编译器无法匹配模板函数。
完整可运行示例(C++17版本)
#include <boost/type_index.hpp> #include <iostream> template<typename... Ts> void print_types() { using namespace boost::typeindex; // C++17折叠表达式展开参数包 ((std::cout << type_id_with_cvr<Ts>().pretty_name() << " "), ...); std::cout << "\n"; } // 测试类型 class cDog {}; int main() { print_types<int, const char*, double, cDog>(); return 0; }
完整可运行示例(C++14兼容版本)
#include <boost/type_index.hpp> #include <iostream> // 空参数包终止函数 void print_types() { std::cout << "\n"; } // 递归展开模板参数包 template<typename T, typename... Ts> void print_types() { using namespace boost::typeindex; std::cout << type_id_with_cvr<T>().pretty_name() << " "; print_types<Ts...>(); } class cDog {}; int main() { print_types<int, const char*, double, cDog>(); return 0; }
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

