2013-06-28 105 views
0

如何爲所有枚舉專門設計模板。 就像它那樣boost::serialization枚舉模板

在升壓:

template <typename Archive> 
void serialize(Archive &AR, const unsigned int ver) 
{ 
AR & enum__; 
AR & int__; 
AR & class__; 
} 

我需要operator&所有枚舉:

struct A 
{ 
void operator&(int obj){std::cout << "1";} 
void operator&(unsigned int obj){std::cout << "2";} 

template <typename T> 
typename std::enable_if<std::is_enum<T>::value,void>::type operator&(T & obj) { std::cout << "Is enum" << std::endl; } 

template<typename T> 
void operator&(T & obj){obj.metod(); std::cout << "3";} // this operator not for enums 
}; 

enum enum__{AAA,BBB}; 
enum enum2__{AAA2,BBB2}; 

int main() 
{ 
A a; 
enum__ d = AAA; 
a & d; 

enum2__ e = AAA2; 
a & e; 

std::system("pause"); 
return 0; 
} 

錯誤C2593:操作員&是曖昧

+1

你看着http://en.cppreference.com/w/cpp/types/is_enum?這可以與enable_if結合使用。 –

+0

Get: 錯誤C2593:運算符&不明確 – manking

+0

在相反的條件下限制其他超載不是枚舉。 –

回答

1

錯誤C2593:操作員&是模糊

假設您將一個枚舉類型傳遞給operator&。然後編譯器將生成具有相同函數參數的operator&的兩個版本。這就是爲什麼你有一個模棱兩可的錯誤。您應該添加模板特供非枚舉

template<typename T> 
typename std::enable_if<!std::is_enum<T>::value,void>::type 
operator&(T & obj) 
{ 
    obj.metod(); 
    std::cout << "3"; 
} 
+0

這工作。謝謝。 – manking