Tôi đang cố gắng nhóm các chuyên môn lại với nhau để tránh viết chúng nhiều lần. Ví dụ, trong đoạn code dưới đây, tôi cố gắng chuyên "float" và "double" như một trường hợp thực hiện cho foo :: func(); Sau đó tôi sử dụng một triển khai khác cho "bool".Tại sao loại phụ thuộc này không được tính là chuyên môn bằng cách sử dụng đối số mẫu?
template<typename T> struct foo;
template<typename T> struct bar;
template<> struct bar<float> { typedef float Type; };
template<> struct bar<double> { typedef double Type; };
/* specialize for float and double here */
template<typename T> struct foo<typename bar<T>::Type> {
static void func() { ... }
};
template<> struct foo<bool> {
static void func() { ... }
};
Lỗi này trong GCC 4.4.3. (Đây là một trình biên dịch mục tiêu, bởi vì nó là cổ phiếu cho Ubuntu Server 10.04 LTS, mà bị cáo buộc có hơn ba năm để sống.) Lỗi này là:
foo.cpp:8: error: template parameters not used in partial specialization:
foo.cpp:8: error: ‘T’
Lỗi đề cập đến chuyên môn đầu tiên của foo (cho " float "và" double. ")
Tôi không thấy phần nào của C++ tôi vi phạm ở đây - nếu có ai biết chương và câu, tôi sẽ đánh giá cao nó. Ngoài ra, nếu ai đó biết cách khác để hoàn thành cùng một mục tiêu (sử dụng lại các chuyên môn cho một số nhóm nhất định, không có mã tiết không cần thiết), tôi cũng đánh giá cao bất kỳ đề xuất nào!
Tôi sẽ rất vui khi nhận được thông báo lỗi "không rõ ràng về mẫu" nếu có nhiều thanh có cùng khai báo Kiểu. Trình biên dịch thực sự có tất cả thông tin cần thiết. Thật kỳ lạ, một người bạn báo cáo rằng tuyên bố này hoạt động trên GCC 4.1 trên MacOS X. Dù sao - cảm ơn cho câu trả lời, và đề nghị làm việc xung quanh. Có vẻ như điều đó có thể hiệu quả với tôi! –