Tôi đã đánh trúng một bộ não thật sự trong C++, nó chưa bao giờ xảy ra với tôi trước đây.Chức năng mẫu C++ nhận giá trị mặc định không chính xác
Ý chính của vấn đề là khi yêu cầu hàm (mẫu) của tôi, các đối số mà tôi đã xác định mặc định có giá trị của chúng bị xáo trộn. Nó chỉ xảy ra nếu tôi gọi hàm với giá trị mặc định.
hàm mẫu của tôi được khai báo như thế này:
template <typename T>
vector2<T> transform(vector2<T> const &vec, matrix4<T> const &m, T z = T(0), T w = T(1));
Nó được sau đó, trong cùng một tiêu đề, định nghĩa như thế này:
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);
}
Bây giờ khi tôi gọi đây với giá trị mặc định (transform(vector2<double>(0, 1), view_transform)
) Tôi không nhận được các giá trị tôi mong đợi. Bước vào transform
với trình gỡ lỗi VC++ s Tôi thấy z
và w
có các giá trị "vui" (theo kinh nghiệm của tôi có nghĩa là một cái gì đó không được khởi tạo đúng cách).
Ví dụ giá trị hài hước sẽ là: 0,0078125000000000000 và 2.104431116947e-317 # DEN
Giờ đây tôi đã cố gắng tìm câu trả lời về C++ Hỏi đáp Lite, googling nó; thậm chí cố gắng bình tĩnh với Schubert, nhưng tôi không thể cho cuộc sống của tôi tìm ra nó. Tôi đoán nó thực sự đơn giản và tôi nghi ngờ đó là một số loại tomfoolery mẫu tại nơi làm việc.
Có cách nào để có được các giá trị mặc định mà tôi mong đợi và muốn không, và tại sao nó lại làm điều này với tôi?
Sửa 1:
Nếu tôi gọi đổi để nó sử dụng phao nổi thay vì (transform(vector2<float>(0, 1), view_transform)
) vấn đề đi xa. Có vẻ như điều này chỉ xảy ra nếu T
= double
.
Chỉnh sửa 2:
Nó chỉ xảy ra nếu tôi có hai chuyên ngành cho double
và float
. Nếu tôi sử dụng một chuyên ngành nổi ở một nơi thì chuyên môn hóa kép sẽ có giá trị mặc định lạ. Nếu tôi thay đổi tất cả các địa điểm mà hàm được gọi để nó sử dụng gấp đôi các vấn đề "biến mất". Tôi vẫn không hiểu tại sao mặc dù, nó giống như nó sử dụng bù đắp sai sót hoặc một cái gì đó khi thiết lập z
và w
.
Sửa 3:
Tales from C++ Crypt:
#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);
}
Trong 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);
}
// ...
Nếu tôi chạy đó, hai chuyên ngành có nó mặc định đối số chính xác, nhưng phiên bản float nhận được cả hai đối số mặc định là zero (0,000000) mặc dù tốt hơn, nó vẫn không phải là z = 0
và w = 1
.
Sửa 4:
Made một Connect issue.
Tôi không thể thấy bất cứ điều gì sai trái với nó ... Bạn có thể thử nó dưới một trình biên dịch khác nhau? –
Trình biên dịch nào bạn đang sử dụng và nền tảng nào là bạn? – Alerty
Ah xin lỗi, quên thông tin đó, Microsoft VC++ 10 (16.00.30319.01). @ j_random_hacker: Hmm, tôi cũng có thể tải xuống MinGW và thử. – Skurmedel