template <typename T>
class rp {
};
template <template <typename> class P>
struct b {
template <class, template <typename> class FriendP>
friend void f(b<FriendP> from);
};
template <class, template <typename> class P>
void f(b<P> from) {
}
int main() {
b<rp> v;
f<int>(v);
return 0;
}
Clang 3.3 (svn) biên dịch tốt, trong khi GCC 4.8 từ chối yêu cầu:GCC tuyên bố một hàm bạn để bị quá tải, gọi mơ hồ, kêu vang biên dịch
main.cpp: In function 'int main()':
main.cpp:17:10: error: call of overloaded 'f(b<rp>&)' is ambiguous
f<int>(v);
^
main.cpp:17:10: note: candidates are:
main.cpp:12:6: note: void f(b<P>) [with <template-parameter-1-1> = int; P = rp]
void f(b<P> from) {
^
main.cpp:8:17: note: void f(b<FriendP>) [with <template-parameter-2-1> = int; FriendP = rp; P = rp]
friend void f(b<FriendP> from);
^
Tôi tự hỏi tại sao GCC tuyên bố f
để bị quá tải . Vì vậy, tôi đoán đó là một lỗi GCC.
Trình biên dịch nào là đúng?
'f()' nào gọi clang? –
Vì chỉ định nghĩa '' bên ngoài 'b' có phần thân và không có lỗi liên kết, nên' f' phải được gọi ra. Thực ra chỉ có một 'f'. – hpohl
Tôi muốn nói đây là lỗi GCC. –