VS2017模板专用化错误无法从'Class *(__cdecl *)(Args...)'转换为'Class *(__cdecl *)(Args...)'
VS2017 template specialization error cannot convert from 'Class *(__cdecl *)(Args...)' to 'Class *(__cdecl *)(Args...)'
这是我迁移到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 *;
};
也许这可以通过延迟继承的实例化来解决问题 法典。我们不确定:)
相关文章:
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- "Undefined class"作为is_base_of的论据
- 如何将class.cpp和class.hpp编译为一个.o文件
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使用"derived input class"创建派生类?
- 错误:"Left of getValue must have class/struct/union"
- ' class a : b ' 和 ' class a : public b ' 之间的继承类不同
- MINGW - 正确运行函数所需的 cdecl
- Pybind11 Class Definition
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- C2011 'CMemDC':Visual Studio 2019中的'class'类型重新定义
- TypeError: [c++ addon class] 不是构造函数
- C++ class template
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- Clearing Class Foo with new(pFoo) Foo()
- C++ class vs a library
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- 使用"class"关键字,后跟未声明的标识符