मैंने सी ++ में एक वास्तविक मस्तिष्क स्कोचर पर मारा है, यह पहले कभी मेरे साथ नहीं हुआ है।सी ++ टेम्पलेट फ़ंक्शन गलत डिफ़ॉल्ट मान
समस्या का सारांश यह है कि मेरे (टेम्पलेट) फ़ंक्शन के आविष्कार पर तर्कों को परिभाषित करने के लिए मैंने उनके मानों को स्कैम्बल किया है। यह केवल तब होता है जब मैं फ़ंक्शन को डिफ़ॉल्ट के साथ कॉल करता हूं।
template <typename T>
vector2<T> transform(vector2<T> const &vec, matrix4<T> const &m, T z = T(0), T w = T(1));
यह बाद में, एक ही शीर्षक में, इस तरह परिभाषित किया गया है:
मेरे टेम्पलेट समारोह इस तरह घोषित किया जाता है
template <typename T>
inline vector2<T> transform(vector2<T> const &vec, matrix4<T> const &m, T z, T w)
{
vector4<T> res = m * vector4<T>(vec.x, vec.y, z, w);
return vector2<T>(res.x, res.y);
}
अब
जब मैं के साथ चूक (transform(vector2<double>(0, 1), view_transform)
) मैं इस फोन मुझे उम्मीदों को प्राप्त न करें। वीसी ++ एस डीबगर के साथ में कदम उठाने में मुझे z
और w
"मजेदार" मान (जो मेरे अनुभव में है कि कुछ ठीक से शुरू नहीं किया गया है) देखें।
उदाहरण अजीब मूल्यों होगा: 0.0078125000000000000 और 2.104431116947e-317 # डेन
अब मैं, पर सी ++ पूछे जाने वाले प्रश्न लाइट उत्तर ढूंढना यह googling की कोशिश की है; शूबर्ट के साथ खुद को शांत करने की भी कोशिश की, लेकिन मैं इसके जीवन के लिए इसे समझ नहीं सकता। मुझे लगता है कि यह वास्तव में सरल है और मुझे संदेह है कि यह काम पर किसी प्रकार का टेम्पलेट टॉमफूलरी है।
क्या मेरे द्वारा अपेक्षित डिफ़ॉल्ट मूल्यों को प्राप्त करने और इच्छित करने का कोई तरीका है, और यह मेरे साथ ऐसा क्यों करता है?
संपादित करें 1:
अगर मैं परिवर्तन कॉल तो यह तैरता बजाय का उपयोग करता है (transform(vector2<float>(0, 1), view_transform)
) समस्या दूर चला जाता है। ऐसा प्रतीत होता है कि यह तब होता है जब T
= double
।
संपादित करें 2:
यह केवल होता है अगर मैं double
और float
के लिए दो विशेषज्ञताओं की है। यदि मैं एक स्थान पर एक फ्लोट विशेषज्ञता का उपयोग करता हूं तो डबल विशेषज्ञता अजीब डिफ़ॉल्ट मान प्राप्त करती है। यदि मैं उन सभी स्थानों को बदलता हूं जिन्हें फ़ंक्शन कहा जाता है, तो यह "दूर चला जाता है" समस्याओं को दोगुना उपयोग करता है। मुझे अभी भी समझ में नहीं आ रहा है कि क्यों, ऐसा लगता है कि यह z
और w
सेट करते समय दोषपूर्ण ऑफ़सेट या कुछ का उपयोग कर रहा है।
संपादित करें 3: सी ++ क्रिप्ट से
किस्से:
#include <sgt/matrix4.hpp>
int main(int argc, char *argv[])
{
sgt::matrix4<double> m0(
2, 0, 0, 1,
0, 2, 0, 1,
0, 0, 1, 0,
0, 0, 0, 1);
m0 *= m0;
sgt::vector2<double> blah0 = sgt::transform(sgt::vector2<double>(1, 0), m0);
sgt::matrix4<float> m1(
2, 0, 0, 1,
0, 2, 0, 1,
0, 0, 1, 0,
0, 0, 0, 1);
m1 *= m1;
sgt::vector2<float> blah1 = sgt::transform(sgt::vector2<float>(1, 0), m1);
printf("%f", blah0.x);
printf("%f", blah1.x);
}
matrix4.hpp में:
// ...
template <typename T>
vector2<T> transform(vector2<T> const &vec, matrix4<T> const &m, T z = T(0), T w = T(1));
template <typename T>
inline vector2<T> transform(vector2<T> const &vec, matrix4<T> const &m, T z, T w)
{
vector4<T> res = m * vector4<T>(vec.x, vec.y, z, w);
return vector2<T>(res.x, res.y);
}
// ...
अगर मैं चलने वाले, डबल विशेषज्ञता है यह डिफ़ॉल्ट है तर्क सही हैं, लेकिन फ्लोट संस्करण को शून्य (0.000000) के रूप में डिफ़ॉल्ट तर्क दोनों मिलते हैं, हालांकि यह अभी भीनहीं है 210 और w = 1
।
संपादित 4:
एक Connect issue बनाया।
मुझे इसके साथ कुछ भी गलत नहीं दिखाई दे रहा है ... क्या आप इसे एक अलग कंपाइलर के तहत आजमा सकते हैं? –
आप किस कंपाइलर का उपयोग कर रहे हैं और आप किस प्लेटफॉर्म पर हैं? – Alerty
आह क्षमा करें, उस जानकारी को भूल गए, माइक्रोसॉफ्ट वीसी ++ 10 (16.00.30319.01)। @j_random_hacker: हम्म, ठीक है, मैं मिनजीडब्ल्यू डाउनलोड कर सकता हूं और कोशिश कर सकता हूं। – Skurmedel