如何解决VS2019 C++模板函数traits实现报C2760语法错误问题
问题原因
该编译错误不是VS2019的BUG,属于C++标准强制要求的语法规则,GCC是在非严格模式下做了兼容处理,未严格执行标准要求。
触发错误的核心逻辑:function_traits<_ChFunction>是依赖模板参数_ChFunction的从属类型,访问其内部的模板别名argument时,必须显式添加template关键字告知编译器后续的<是模板参数列表的分隔符,而非小于运算符,否则编译器会发生语法解析错误。
修复方案
直接修改ChTemplate函数内的变量定义代码即可:
原错误代码:
typename function_traits<_ChFunction>::argument<0> a;
修改为:
typename function_traits<_ChFunction>::template argument<0> a;
修改后即可在VS2019下正常编译,同时兼容GCC、Clang等其他编译器。
完整可编译代码
#include <functional> #include <tuple> #include <type_traits> class CChTest { public: CChTest() { } bool ChDeneme(int a, int b) { return false; } }; template<typename> struct function_traits; template <typename Function> struct function_traits : public function_traits< decltype(&std::remove_reference<Function>::type::operator())> { }; template < typename ClassType, typename ReturnType, typename... Arguments> struct function_traits< ReturnType(ClassType::*)(Arguments...) const> : function_traits<ReturnType(*)(Arguments...)> { }; template < typename ClassType, typename ReturnType, typename... Arguments> struct function_traits< ReturnType(ClassType::*)(Arguments...)> : function_traits<ReturnType(*)(Arguments...)> { }; template < typename ReturnType, typename... Arguments> struct function_traits< ReturnType(*)(Arguments...)> { typedef ReturnType result_type; template <std::size_t Index> using argument = typename std::tuple_element< Index, std::tuple<Arguments...>>::type; static const std::size_t arity = sizeof...(Arguments); }; template < typename _ChClass, typename _ChFunction> void ChTemplate( _ChClass cl, _ChFunction fn) { // 仅修改了这一行,添加了template关键字 typename function_traits<_ChFunction>::template argument<0> a; } int main() { CChTest ChTest; ChTemplate(&ChTest, &CChTest::ChDeneme); return 0; }
额外优化建议
如果不想每次调用都手写template关键字,也可以做以下调整:
- 调整function_traits的设计,对外暴露非模板的类型别名,简化调用语法
- C++17及以上标准可以直接使用
std::invoke_result_t、std::tuple_element_t配合std::function等标准组件实现参数类型提取,避免自定义模板的语法问题 - 若希望GCC也执行严格的标准检查,可以添加编译参数
-fpermissive-开启严格模式,提前发现类似的语法不规范问题
内容的提问来源于stack exchange,提问作者VeNToR
相关产品推荐
相关产品推荐

