VS2017模板专用化错误无法从'Class *(__cdecl *)(Args...)'转换为'Class *(__cdecl *)(Args...)'

VS2017 template specialization error cannot convert from 'Class *(__cdecl *)(Args...)' to 'Class *(__cdecl *)(Args...)'

本文关键字:cdecl Class Args 转换 VS2017 错误 专用      更新时间:2023-10-16

这是我迁移到VS2017的代码库的简单版本。 以下代码在 VS2013 和英特尔C++编译器 2017 更新 4 中编译,但不在 VS2013 中编译。

#include  <type_traits>
template<typename F, F f>
struct S1
{};
template<typename F, F f>
struct S2
{};
template<typename F, F f>
using BaseType = typename std::conditional<std::is_member_function_pointer<F>::value, S1<F, f>, S2<F, f>>::type;
template<typename Class, typename... Args>
Class * call_constructor(Args... args)
{
return new Class(args...);
}
template<class Class, typename... Args>
struct Constructor : BaseType<Class *(*)(Args...), call_constructor<Class, Args...>>
{
using ReturnType = Class *;
};
int main() {}

我在构造函数类的定义上收到错误:

main.cpp(20(: 错误 C2440:"专业化": 无法从"类 *(__cdecl *((参数...("转换为"类 *(__cdecl *((参数...(" 注意:作用域中具有此名称的函数都与目标类型不匹配 注意:请参阅对正在编译的类模板实例化"构造函数"的引用

如果我直接从 S1 或 S2 继承构造函数,错误就会消失。所以我认为问题在于 std::条件定义。

有什么想法吗?谢谢。

在尝试了多次重写代码之后,我的一位同事想出了获胜的版本:

template<typename F, F f>
struct BaseType_
{
using type = typename std::conditional<std::is_member_function_pointer<F>::value, S1<F, f>, S2<F, f>>::type;
};
template<typename F, F f>
using BaseType = typename BaseType_<F, f>::type;
template<class Class, typename... Args>
struct Constructor : BaseType_<Class*(*)(Args...), call_constructor<Class, Args...>>::type
{
using ReturnType = Class *;
};

也许这可以通过延迟继承的实例化来解决问题 法典。我们不确定:)