2011-03-13 65 views
1

該代碼用VS(/ za)編譯,但不能用GCC編譯。誰是對的,誰是錯的?或者兩者都是錯誤的/正確的?GCC vs VS匿名類型作爲模板參數

#include <iostream> 
#include <type_traits> 
using namespace std; 

struct NullType 
{ 
    //NullType(){} 
template<class T> 
    NullType(T value){} 
enum {value}; 
}; 

template<class T> 
struct IntType 
{ 
    typedef T type; 

}; 

template<int value_> 
struct Low 
{ 
    typedef int type; 
    enum {value = value_}; 
}; 

template< class T> 
struct Low_impl 
{ 
protected: 
T value_; 
Low_impl():value_(T()){/*e.b.*/} 
Low_impl(T value):value_(value){/*e.b.*/} 
}; 

template<class T> 
struct isNullType 
{ 
    enum {value = false}; 
}; 

template<> 
struct isNullType<NullType> 
{ 
    enum {value = true}; 
}; 

template<class T> 
struct TypeTraits 
{ 
    typedef T type; 
}; 



/*template<> 
struct TypeTraits<int> 
{ 
    typedef int type; 
};*/ 

template<class Int_> 
struct Int_Type_Tag 
{ 
    static_assert(std::is_integral<Int_>::type,"Non Integral Type Is ILLEGAL As a Parameter to this class "); 
    typedef Int_ type; 
}; 

template<class T> 
struct TypeTraits<Int_Type_Tag<T>> 
{ 
    typedef typename Int_Type_Tag<T>::type type; 
}; 

template<class Int_Type,class L = NullType> 
struct Int : private std::conditional<isNullType<L>::value, 
             NullType, 
             Low_impl<typename TypeTraits<Int_Type>::type>>::type 
{ 
    typedef typename std::conditional<isNullType<L>::value, 
             NullType, 
             Low_impl<typename TypeTraits<Int_Type>::type>>::type BaseType; 
Int():BaseType(L::value){} 
}; 

int main() 
{ 
    Int<int> a; 
    cout << sizeof(a); 
    return 0; 
} 

從GCC 4.5.1錯誤
錯誤:調用 '零式::零式(零式:: &)' 不匹配函數|

+1

添加'boost'標籤。 – Beta 2011-03-13 16:47:36

+1

我投票結束,因爲這不是一個真正的問題。當你不發佈代碼應該做什麼*或者應該怎麼做,或者GCC的編譯器錯誤時,我們當中的任何人應該知道該怎麼做? – Puppy 2011-03-13 16:48:18

+0

您在GCC中遇到什麼錯誤?哪裏? – 2011-03-13 16:48:29

回答

3

您需要實例化一個匿名枚舉類型NullType::value的類型NullType::NullType(T)

這是N2657允許的,它在gcc 4.5中實現。

+0

好的答案 - 我已經改變了標題,使其更有用 – 2011-03-13 18:15:07

+0

,但是你認爲最新的草案允許的是「這個」,即3242?爲什麼它會在VS上編譯,而不是在GCC上編譯? – 2011-03-13 18:40:55

+0

@There - 在C++ 1998中,這個限制在[temp.arg.type]中:「一個本地類型,一個沒有鏈接的類型,一個未命名類型......不能用作模板類型的模板參數 - 參數。」這個條款在某種程度上被修改以引用外部鏈接的定義,但N2657完全刪除了它,並且它在最新的草案中不存在。我猜VS早日實施了這一點,或者在標準尚未實施時可能無法實施。我不確定爲什麼你在gcc 4.5.1中遇到錯誤; gcc 4.5.3編譯它很好。 – aaz 2011-03-13 19:34:24