मैं एक साधारण वेक्टर वर्ग लिख रहा हूं और मैं कुछ सदस्य कार्य करना चाहता हूं जो केवल कुछ लंबाई के वैक्टर में उपलब्ध हैं (क्रॉस उत्पाद उदाहरण के लिए एक 3 तत्व वेक्टर)। मैं std :: enable_if भर में ठोकर खा रहा हूं और ऐसा लगता है कि यह वही कर सकता है जो मैं चाहता हूं, लेकिन मुझे लगता है कि यह सही तरीके से काम नहीं कर पा रहा है।सी ++ 11 std :: enable_if का उपयोग करके सदस्य कार्य को सक्षम करने के लिए वेक्टर विशिष्ट लंबाई
#include <iostream>
#include <type_traits>
template<typename T, unsigned int L>
class Vector
{
private:
T data[L];
public:
Vector<T,L>(void)
{
for(unsigned int i = 0; i < L; i++)
{
data[i] = 0;
}
}
T operator()(const unsigned int i) const
{
return data[i];
}
T& operator()(const unsigned int i)
{
return data[i];
}
Vector<typename std::enable_if<L==3, T>::type, L> cross(const Vector<T,L>& vec2) const
{
Vector<T,L> result;
result(0) = (*this)(1) * vec2(2) - (*this)(2) * vec2(1);
result(1) = (*this)(2) * vec2(0) - (*this)(0) * vec2(2);
result(2) = (*this)(0) * vec2(1) - (*this)(1) * vec2(0);
return result;
}
};
int main(void)
{
Vector<double,3> v1;
Vector<double,3> v2;
Vector<double,3> v3;
//Vector<double,4> v4;
v1(0) = 1;
v1(1) = 2;
v1(2) = 3;
v2(0) = 4;
v2(1) = 5;
v2(2) = 6;
v3 = v1.cross(v2);
std::cout << v3(0) << std::endl;
std::cout << v3(1) << std::endl;
std::cout << v3(2) << std::endl;
return 0;
}
compiles ऊपर कोड और सही ढंग से चलता है, लेकिन अगर मैं Vector<double,4> v4
की घोषणा मैं करने के संकलन में निम्न त्रुटि uncomment:
vec.cpp: In instantiation of ‘class Vector<double, 4u>’:
vec.cpp:46:22: required from here
vec.cpp:29:59: error: no type named ‘type’ in ‘struct std::enable_if<false, double>’
किसी का कहना है करने में सक्षम है, जहां मैं गलत जा रहा हूँ है?
की [? मैं बढ़ावा :: एक सदस्य समारोह पर \ _if सक्षम उपयोग कर सकते हैं] संभव डुप्लिकेट (http (यह अभी भी सी ++ मानक के उपर्युक्त दो पैराग्राफ से इस प्रकार है) .com/प्रश्न/4880 9 22/कैन-ए-यूज-बूस्टेनेबल-अगर-ऑन-ए-सदस्य-फ़ंक्शन) –
आप शायद 'टाइपनाम std :: enable_if <एल == 3, वेक्टर> :: टाइप' के बजाय 'वेक्टर <टाइपनाम std :: enable_if :: प्रकार, एल>'। –
(आप संभवतः 'टी कॉन्स्ट' ('' को वापस करने के लिए अपना कॉन्स 'ऑपरेटर() 'चाहते हैं। वर्तमान कोड ग्राहकों को' वेक्टर वी; वेक्टर कॉन्स और const_v = v; const_v (2) = 42.0; // नोट की तरह कुछ करने देता है 42 का लेखन एक अस्थायी होता है। उपयोगकर्ता द्वारा अपेक्षित नहीं ') –