我碰到一個問題,將一些代碼移植到MSVC中,令我感到困惑。據我所知,代碼應該是合法的,Clang編譯它就好了。爲什麼MSVC無法編譯這個模板函數?
我已經收窄到以下幾點:
enum E {
x
};
template <typename T>
struct traits {
static const E val = x;
};
template <E e>
struct S {
S(){};
};
template <typename T>
S<traits<T>::val> foo(T t);
int main() {
char c = 0;
foo(c);
}
注意,編譯後的代碼預計產量鏈接錯誤(我剝奪功能foo
的定義保持樣品最小),但據我所知應該乾淨地編譯。
但是,MSVC給了我這個錯誤:
error C2893: Failed to specialize function template 'S::val> foo(T)'
所以我的問題:
- 是MSVC在拒絕代碼正確的機會嗎? (如果是這樣,爲什麼?)
- 如果沒有,任何人都可以縮小它做錯了什麼?如同它是否是一種他們根本沒有實現的語言特性(比如模板的兩階段名稱查找),或者「只是」他們聲稱支持的功能實現中的一個普通錯誤?
我轉載的問題上VC++ 2010和2012年
與今天早些時候的這個問題有關嗎? [在類型推導之後,函數模板中的替換順序是否有任何保證?](http://stackoverflow.com/questions/15462336/is-there-any-guarantee-on-the-order-of-substitution- in-a-function-template-after) – 2013-03-17 21:58:32
@BoPersson:似乎與我無關。在這裏,我想不出任何其他問題。順便說一句,它在GCC 4.7.2 – 2013-03-17 22:04:56
上按預期工作。而且,如果用'int'代替'enum',錯誤就會消失。它似乎是一個與'枚舉'相關的錯誤 – 2013-03-17 22:05:36