2011-04-19 26 views
10

考慮:沒有匹配函數調用<匿名枚舉>

template<typename T> 
void f(T) { 
} 

enum { // if changed to "enum E" it compiles 
    e 
}; 

int main() { 
    f(e); // line 10 
} 

我得到:

foo.cpp: In function ‘int main()’: 
foo.cpp:10: error: no matching function for call to ‘f(<anonymous enum>)’ 

然而,如果enum聲明中給出一個名字,它編譯。爲什麼它不適用於匿名枚舉?理想情況下,我想它促進枚舉值eint和實例f(int)

回答

10

未命名類型根本不能被用作模板參數

C++ 03表示在14.3.1[temp.arg.type]/2

本地型,無鍵的類型,未命名的類型或類型從任何混這些類型不得用作模板類型參數的模板參數。

這個限制在C++ 0x中解除了,你的程序在C++ 0x模式下編譯時沒有MSVC++ 2010和gcc 4.5.2的診斷。

1

你總是可以明確地做推廣,以清楚地顯示你的意圖:

f(static_cast<int>(e));

5

理想情況下,我想它促進枚舉值e爲int和實例F(INT) 。

f(+e);