編譯我有歸結爲下面的代碼:參考模板參數偏特未能在VS2005
template <typename T> struct Foo {};
template <typename T, const Foo<T>& I> struct FooBar {};
////////
template <typename T> struct Baz {};
template <typename T, const Foo<T>& I>
struct Baz< FooBar<T,I> >
{
static void func(FooBar<T,I>& value);
};
////////
struct MyStruct
{
static const Foo<float> s_floatFoo;
};
// Elsewhere: const Foo<float> MyStruct::s_floatFoo;
void callBaz()
{
typedef FooBar<float, MyStruct::s_floatFoo> FloatFooBar;
FloatFooBar myFloatFooBar;
Baz<FloatFooBar>::func(myFloatFooBar);
}
這編譯成功下GCC,但是,VS2005下,我得到:
error C2039: 'func' : is not a member of 'Baz<T>'
with
[
T=FloatFooBar
]
error C3861: 'func': identifier not found
然而,如果我改變const Foo<T>& I
到const Foo<T>* I
(由指針傳遞I
而不是通過引用),並限定FloatFooBar
爲:
typedef FooBar<float, &MyStruct::s_floatFoo> FloatFooBar;
GCC和VS2005都很開心。
發生了什麼事?這是VS2005處理GCC或編譯器錯誤的一些細微的模板替換失敗嗎?
(最奇怪的事情:我以爲我上面的代碼今天上午早些時候在VS2005工作,但是那是我的早晨咖啡之前,我現在不完全肯定我是不是在某種咖啡因的。渴求誘發精神錯亂......)
代碼似乎沒問題。看起來像VS2005中的一個bug。 – 2010-05-18 04:38:56
代碼與Comeau在線編譯,所以可能是好的,限於VS2005 – rotoglup 2010-05-19 06:06:45