Xét đoạn mã sau:phần Template chuyên môn hóa và icc
template <class T, class U, class V>
struct Foo { };
template <class T, class U>
struct Foo<T, U, std::integral_constant<int, U::value>> {
static void print()
{
std::cerr << "instantiated";
}
};
template <class U>
struct Foo<double, U, std::integral_constant<int, U::value>> {
static void print()
{
std::cerr << "instantiated special";
}
};
struct Bar {
static const int value = 0;
};
int main(int argc, char ** argv)
{
using Baz = Foo<double, Bar, std::integral_constant<int, 0>>;
Baz::print();
return 0;
}
Khi tôi biên dịch này với icc 16.0.1, tôi nhận được thông báo sau:
main.cpp(38): error: more than one partial specialization matches the template argument list of class "Foo<double, Bar, std::integral_constant<int, 0>>"
"Foo<T, U, std::integral_constant<int, U::value>>"
"Foo<double, U, std::integral_constant<int, U::value>>"
Baz::print();
Với vang 3.7.1 và gcc 5.3.0 này biên dịch (và "instantiated đặc biệt" được in). Đây có phải là lỗi trong icc hay mã của tôi không chính xác? Đối với tôi, có vẻ rõ ràng rằng chuyên môn hóa thứ hai nghiêm túc hơn chuyên môn thứ nhất; nó giống với đầu tiên khác với thực tế là nó khóa thông số mẫu đầu tiên.
Chỉnh sửa: Tôi nên thêm: nếu đây là lỗi trong icc, có cách giải quyết tốt không?
Có vẻ như một lỗi trong icc với tôi. – Cameron
Bạn có thể kiểm tra xem các đề xuất trong [comments below] (https://stackoverflow.com/questions/37216212/partial-template-specialization-and-icc#comment61972971_37216503) có khắc phục được sự cố trên ICC không? Không phải là một sửa chữa hoàn chỉnh cho vấn đề của bạn, tất nhiên, chỉ là một bước tiến trong cuộc điều tra. – bogdan
Trong mã thực tế, số nguyên đến từ một thành viên lồng nhau của U, điều này lần lượt cho vấn đề clang, do đó, đồng nghiệp của tôi chuyển từ loại không để loại tham số mẫu. –