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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:39:04