Tôi đang viết một số mã TMP-nặng cho g ++ (phiên bản 4.8.1_1, Macports) và clang ++ (phiên bản 3.3, Macports). Mặc dù g ++ từ chối danh sách mã sau bằng UNBRIDLED FURY, clang ++ biên dịch với ân huệ và splendor.g ++ Bug với một phần mẫu chuyên môn
- Trình duyệt nào ở bên phải? (Tôi mạnh mẽ nghi ngờ đó là g ++, nhưng tôi muốn nhận được sự bảo đảm từ những người khác trước khi gửi báo cáo lỗi.)
- Bạn có cách giải quyết dễ dàng hoặc thanh lịch nào không? (Tôi cần phải sử dụng mẫu bí danh, vì vậy chuyển đổi sang cấu trúc, gây g ++ để chấp nhận các mã, không phải là một lựa chọn.)
Dưới đây là danh sách mã, làm chỉ dành riêng cho bạn.
template <class... Ts>
struct sequence;
template <int T>
struct integer;
// This definition of `extents` causes g++ to issue a compile-time error.
template <int... Ts>
using extents = sequence<integer<Ts>...>;
// However, this definition works without any problems.
// template <int... Ts>
// struct extents;
template <int A, int B, class Current>
struct foo;
template <int A, int B, int... Ts>
struct foo<A, B, extents<Ts...>>
{
using type = int;
};
template <int B, int... Ts>
struct foo<B, B, extents<Ts...>>
{
using type = int;
};
int main()
{
using t = foo<1, 1, extents<>>::type;
return 0;
}
Đây là g ++ 's đầu ra:
er.cpp: In function 'int main()':
er.cpp:39:41: error: ambiguous class template instantiation for 'struct foo<1, 1, sequence<> >'
using t = typename foo<1, 1, extents<>>::type;
^
er.cpp:26:8: error: candidates are: struct foo<A, B, sequence<integer<Ts>...> >
struct foo<A, B, extents<Ts...>>
^
er.cpp:32:8: error: struct foo<B, B, sequence<integer<Ts>...> >
struct foo<B, B, extents<Ts...>>
^
er.cpp:39:43: error: 'type' in 'struct foo<1, 1, sequence<> >' does not name a type
using t = typename foo<1, 1, extents<>>::type;
^
Đây là kêu vang ++' s đầu ra:
Nhờ sự giúp đỡ của bạn!
'+ 1' chỉ để đùa thôi :) Tôi cũng cá là Clang ở ngay đây. –
'typename' trong' main' là không cần thiết –
@ DavidRodríguez-dribeas Cảm ơn, nó trở thành một thói quen ... –