错误C2988(无法识别的模板声明/定义)推导方法返回类型

问题描述 投票:0回答:1

我收到错误 C2988(无法识别的模板声明/定义),光标在 *method 参数之前提示。

namespace Bind 
{
    template <typename ModelClass, typename ReturnType>
    static std::unique_ptr<Binding> 
    Get (ReturnType (ModelClass::*method)(),
         const String& source,
         const Symbol& aspect = {})
    {
    // whatever
    return nullptr;
    }

    // ....
}

示例实例化: Function WhateverClass::whateverMemberFunction() 返回 ReturnType 并且不带任何参数。模板参数 ModelClassReturnType 都应该从这个实例化中推导出来:

Bind::Get(&WhateverClass::whateverMemberFunction, "")

该模板可以在 Xcode (Apple) 上正常编译,但在 MSVC 2019 上编译失败。两者都使用 C++17 标准。

我错过了什么?

c++ templates c++17 template-argument-deduction
1个回答
0
投票

这绝对是一个 msvc bug。当参数之一是成员指针类型时,MSVC 似乎在使用

{}
作为默认值时遇到问题。

解决方法

您可以将

{}
更改为
Symbol{}
,如下所示:

Get (ReturnType (ModelClass::*method)(), const String& source,
//---------------------vvvvvv---->changed to this    
const Symbol& aspect = Symbol{})
{
 }
© www.soinside.com 2019 - 2024. All rights reserved.