5

編譯我有歸結爲下面的代碼:參考模板參數偏特未能在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>& Iconst Foo<T>* I(由指針傳遞I而不是通過引用),並限定FloatFooBar爲:

typedef FooBar<float, &MyStruct::s_floatFoo> FloatFooBar; 

GCC和VS2005都很開心。

發生了什麼事?這是VS2005處理GCC或編譯器錯誤的一些細微的模板替換失敗嗎?

(最奇怪的事情:我以爲我上面的代碼今天上午早些時候在VS2005工作,但是那是我的早晨咖啡之前,我現在不完全肯定我是不是在某種咖啡因的。渴求誘發精神錯亂......)

+0

代碼似乎沒問題。看起來像VS2005中的一個bug。 – 2010-05-18 04:38:56

+0

代碼與Comeau在線編譯,所以可能是好的,限於VS2005 – rotoglup 2010-05-19 06:06:45

回答

0

對於我來說,它看起來像VS2005採用的Baz

template <typename T> struct Baz {}; 

這個結構的第一個模板規範確實沒有包含名爲func成員。看起來像VS2005不會正確推導模板參數。

+0

是的,它看起來越來越像VS中的一個bug。 – 2010-05-25 07:08:46