VS2017模板特化错误无法转换为' Class *(__ cdecl *)(Args ...)'到'班级*(__ cdecl *)(Args ...)'

时间:2017-07-24 12:25:55

标签: c++ templates visual-studio-2017 variadic-templates template-specialization

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

 Venue.near([40.71, -100.23], 20)    # venues within 20 miles of a point 

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

  

main.cpp(20):错误C2440:'专业化':无法转换为' Class *(__ cdecl *)(Args ...)'到'班级*(__ cdecl *)(Args ...)'   注意:范围内具有此名称的函数都不匹配目标类型   注意:请参阅类模板实例化'构造函数'正在编制

如果我直接从S1或S2继承Constructor,则错误消失。所以我认为问题在于std :: conditional definitions。

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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