Chúng tôi đang di chuyển sang Sun Studio 12.1 và với trình biên dịch mới [CC: Sun C++ 5.10 SunOS_sparc 2009/06/03]. Tôi đang nhận được lỗi biên dịch khi biên dịch mã được biên dịch tốt với phiên bản trước của Sun Compiler [CC: Sun WorkShop 6 cập nhật 2 C++ 5.3 2001/05/15].Lỗi biên dịch mẫu trong Sun Studio 12
Đây là lỗi biên dịch tôi nhận được.
"Sample.cc": Error: Could not find a match for LoopThrough(int[2]) needed in main(). 1 Error(s) detected. *** Error code 1.
Mã sản phẩm:
#include <iostream>
#define PRINT_TRACE(STR) \
std::cout << __FILE__ << ":" << __LINE__ << ":" << STR << "\n";
template<size_t SZ>
void LoopThrough(const int(&Item)[SZ])
{
PRINT_TRACE("Specialized version");
for (size_t index = 0; index < SZ; ++index)
{
std::cout << Item[index] << "\n";
}
}
/*
template<typename Type, size_t SZ>
void LoopThrough(const Type(&Item)[SZ])
{
PRINT_TRACE("Generic version");
}
*/
int main()
{
{
int arr[] = { 1, 2 };
LoopThrough(arr);
}
}
Nếu tôi bỏ ghi chú mã với phiên bản Generic, mã biên dịch tốt và phiên bản generic được gọi. Tôi không thấy vấn đề này với MSVC 2010 với các phần mở rộng bị vô hiệu hóa và trường hợp tương tự với ideone here. Phiên bản chuyên biệt của hàm được gọi. Bây giờ câu hỏi là, đây có phải là một lỗi trong Sun Compiler không?
Nếu có, cách chúng tôi có thể gửi báo cáo lỗi?
Việc xóa const lẽ workarodun nó? – PlasmaHH
Có. Loại bỏ const hoặc thêm const vào int arr [] là công việc xung quanh. Nhưng, muốn biết nếu đây là lỗi trong trình biên dịch hay hiểu biết của tôi là sai. – Jagannath
Rất có thể nếu các phiên bản mới nhất của clang, gcc, comeau và msvc đồng ý, thì đó là lỗi trong SunCC. Cũng lưu ý rằng SunCC là (trong) nổi tiếng là buggy. Điều này dẫn đến câu hỏi: tại sao không sử dụng gcc? – PlasmaHH