簡體   English   中英

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() {}

我在Constructor類的定義上收到錯誤:

main.cpp(20):錯誤C2440:'specialization':無法從'Class *(__ cdecl *)(Args ...)'轉換為'Class *(__ cdecl *)(Args ...)'注意:沒有范圍內具有此名稱的函數與目標類型注釋匹配:請參閱正在編譯的類模板實例化“構造函數”的引用

如果我直接從S1或S2繼承Constructor,那么錯誤就會消失。 所以我認為問題在於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 *;
};

也許這通過延遲繼承代碼的實例化來解決問題。 我們不確定:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM