gpt4 book ai didi

c++ - VS2017模板特化报错cannot convert from 'Class *(__cdecl *)(Args...)' to 'Class *(__cdecl *)(Args...)'

转载 作者:太空狗 更新时间:2023-10-29 23:12:35 24 4
gpt4 key购买 nike

这是我正在迁移到 VS2017 的代码库的简化版本。以下代码在 VS2013 和 Intel 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): error C2440: 'specialization': cannot convert from 'Class *(__cdecl *)(Args...)' to 'Class *(__cdecl *)(Args...)' note: None of the functions with this name in scope match the target type note: see reference to class template instantiation 'Constructor' being compiled

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

有什么想法吗?谢谢。

最佳答案

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

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 *;
};

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

关于c++ - VS2017模板特化报错cannot convert from 'Class *(__cdecl *)(Args...)' to 'Class *(__cdecl *)(Args...)',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45280618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com