- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是我正在迁移到 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/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!