2014-01-07 28 views
2

錯誤的性質不同於this thread中提到的錯誤。
我想在VC++環境中實現一個SFINAE方式,它會發現一個類是否包含成員(方法)。VC++ SFINAE給出錯誤C2070:'overloaded-function':非法sizeof操作數

下面是一個簡單的代碼:

template<typename Class> 
class HasMember_Method 
{ 
    typedef char (&yes)[2]; 

    template<unsigned int> struct Exists; 

    template<typename V> 
    static yes CheckMember (Exists<sizeof(&V::Method)>*); // <--- VC++ problem 
    template<typename> 
    static char CheckMember (...); 

public: 
    static const bool value = (sizeof(CheckMember<Class>(0)) == sizeof(yes)); 
}; 

這裏Method就是我們正在尋找的成員方法。即使沒有C++ 11,此代碼在g++ environment中也能正常工作。
但是在馬車VC++編譯器錯誤相同的結果:

錯誤C2070:「重載功能」:非法的sizeof操作

我嘗試過其他解決方法SFINAE使用decltype,但沒有運氣。有沒有解決這個問題的更好的解決方法?

+0

[MSDN說](http://msdn.microsoft.com /en-us/library/hh567368.aspx)即使在VS2013中它們也不支持「Expression SFINAE」 – dyp

+0

你使用的是哪個版本的VC? – Jarod42

+0

@ Jarod42,它在VS2010/12中不起作用。錯誤。Dyp,使用C++ 11的任何替代方法? – iammilind

回答

2

雖然下面是不正確的答案,但它至少可以解決問題。在代碼片段中,我更改了2行:

template<typename Class> 
class HasMember_Method 
{ 
    typedef char (&yes)[2]; 

    template<typename> struct Exists; // <--- changed 

    template<typename V> 
    static yes CheckMember (Exists<decltype(&V::Method)>*); // <--- changed (c++11) 
    template<typename> 
    static char CheckMember (...); 

public: 
    static const bool value = (sizeof(CheckMember<Class>(0)) == sizeof(yes)); 
}; 

這就解決了VS2010/12中的編譯問題!

等待!這揭示了錯誤的VC++編譯器的另一個缺陷。
結果總是爲真。 :(
這裏的good old g++ works細爲好。

所以正確答案是等待微軟VC++編譯器團隊來解決這些問題。