2012-03-27 16 views
6

संभव डुप्लिकेट:बढ़ावा :: enable_if_c काम करने के लिए प्रतीत नहीं होता

template<typename T, size_t N> class Vector 

मैं विशिष्ट के लिए निर्माताओं को सक्षम करना चाहते:
How to use enable_if to enable member functions based on template parameter of class

मैं एक वर्ग टेम्पलेट N, इसलिए मैं करता हूं:

Vector(typename boost::enable_if_c<N==2, T>::type const &e0, T const &e1) { 
    data[0] = e0; 
    data[1] = e1; 
} 

लेकिन कंपाइलर (एमएसवीसी 2010 एसपी 1) मुझे SFINAE लगाने के बजाय एक त्रुटि देता है। त्रुटि है:

error C2039: 'type' : is not a member of 'boost::enable_if_c<B,T>' 
     with 
     [ 
      B=false, 
      T=float 
     ] 

समस्या क्या है? क्या यह एक ज्ञात समस्या है? मेरे द्वारा यह कैसे किया जा सकता है? क्या यह static_assert का उपयोग करने का एकमात्र समाधान है?

संपादित करें: जीसीसी या तो सफल होने नहीं करता है: http://ideone.com/7Ejo8

+0

आप ideone पर एक SSCE पोस्ट कर सकते हैं (और यह जीसीसी पर सफलतापूर्वक संकलन दिखाने)? –

+0

@ बेन वोगेट: जीसीसी इसे संकलित नहीं करता है। –

+0

@Vlad Lazarenko: लेकिन वहां यह ठीक से वर्णन नहीं किया गया है कि इसे कैसे ठीक किया जाए। –

उत्तर

5

आप enable_if उपयोग नहीं कर सकते अनुमति देने के लिए/वर्ग के टेम्पलेट मापदंडों के आधार पर सदस्य कार्यों नामंज़ूर: enable_if केवल समारोह या वर्ग टेम्पलेट्स पर लागू किया जा सकता है।

आपके मामले में, एकमात्र समाधान जिसे मैं सोच सकता हूं, पूरे वर्ग को विशेषज्ञता दे रहा है, या तो आंशिक विशेषज्ञता के साथ enable_if या अधिक का उपयोग कर रहा है। आप एक आम आधार वर्ग में आम सदस्यों डाल सकते हैं, उन्हें दोहरा से बचने के लिए:

#include <cstdio> 

template<typename T, std::size_t N> 
struct VectorCommon 
{ 
    std::size_t size() { return N; } 
    void add(T const & element) { } 
}; 

template <typename T, std::size_t N> 
struct Vector : VectorCommon<T, N> 
{ 
}; 

template <typename T> 
struct Vector<T, 2> : VectorCommon<T, 2> 
{ 
    Vector(T const & e0, T const & e1) {} 
}; 

int main() 
{ 
    //Vector<int, 100> v100(12, 42); // compile error 

    Vector<char, 2> v2('a', 'b'); // ok 
} 
संबंधित मुद्दे

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