Quy trình so sánh các loại chuyên môn template
là gì? Tiêu chuẩn không được nêu chi tiết về điểm này (hoặc tôi thiếu địa điểm phù hợp).
Câu hỏi của tôi KHÔNG GÌ với quyết định sử dụng chuyên môn nào trong quá trình khởi tạo. Xin vui lòng, không bình luận về điều đó. Câu hỏi đặt ra là so sánh các chuyên môn với nhau để quyết định xem chuyên môn cụ thể đã được xác định hay chưa.Tại sao trình biên dịch không đưa ra lỗi trong khi xác định các chuyên môn mẫu tương tự?
xem xét mẫu mã này:
template <class x1, class x2>
struct CoreTemplate { };
template <class x1, class x2>
struct CoreTemplate<x1*, x2*> { int spec; CoreTemplate() { spec = 1; } };
template <class x1, class x2>
struct CoreTemplate<x2*, x1*> { int spec; CoreTemplate() { spec = 2; } };
int main(int argc, char* argv[])
{
CoreTemplate<int*, int*> qq;
printf("var=%d.\r\n", qq.spec);
}
Khi tôi cố gắng để biên dịch mã này với MSVC, tôi nhận được một lỗi cho các nỗ lực instantiation bên trong main
chức năng:
cpptest1.cxx (15): lỗi C2752: '
CoreTemplate<x1,x2>
': nhiều chuyên môn từng phần khớp với danh sách đối số mẫu
Đối với tôi nó sẽ là hợp lý hơn để phát hành một lỗi cho một nỗ lực để khai báo chuyên môn mẫu giống hệt nhau. Tôi không thấy bất kỳ sự khác biệt nào giữa các chuyên ngành ở trên.
Vì vậy, không ai biết quy tắc so sánh các chuyên môn về mẫu? Các bài báo, liên kết, sách, vv cũng sẽ giúp ích.
Câu hỏi hay. Đã chỉnh sửa với tiêu đề và thẻ thích hợp. – iammilind
FYI: clang 3.1 có vẻ có hành vi tương tự. –