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); 
} 

यह सफलतापूर्वक जीसीसी के तहत संकलित है, तथापि, 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; 

दोनों जीसीसी और वीएस2005 खुश हैं।

क्या चल रहा है? क्या यह किसी प्रकार का सूक्ष्म टेम्पलेट प्रतिस्थापन विफलता है कि वीएस2005 जीसीसी, या एक कंपाइलर बग के लिए अलग-अलग हैंडलिंग कर रहा है?

(अजीब बात: मैं सोचा मैं ऊपर कोड पहले आज सुबह VS2005 में काम कर रहा था लेकिन वह अपनी सुबह की कॉफी पहले था अब मैं पूरी तरह से कुछ नहीं मैं caffeine- किसी प्रकार के तहत नहीं था हूँ।। लालसा प्रेरित प्रलाप ...)

+0

कोड ठीक लगता है। वीएस2005 में एक बग की तरह लग रहा है। –

+0

कोड आओउ ऑनलाइन के साथ संकलित करता है, तो शायद यह ठीक है, वीएस2005 – rotoglup

उत्तर

0

मेरे लिए यह VS2005 की तरह लग रहा Baz

template <typename T> struct Baz {}; 

यह struct के पहले टेम्पलेट विनिर्देशन का उपयोग करता वास्तव में एक सदस्य func नामित शामिल नहीं है। ऐसा लगता है कि वीएस2005 टेम्पलेट पैरामीटर को सही ढंग से कम नहीं करता है।

+0

तक सीमित है हाँ, यह वीएस में एक बग की तरह दिख रहा है। –

संबंधित मुद्दे