Đang cố gắng để thực hiện một class
kết bạn với một chức năng extern "C"
, mã này hoạt động:hệ hữu nghị với extern chức năng "C" dường như đòi hỏi :: để đủ điều kiện tên
#include <iostream>
extern "C" {
void foo();
}
namespace {
struct bar {
// without :: this refuses to compile
friend void ::foo();
bar() : v(666) {}
private:
int v;
} inst;
}
int main() {
foo();
}
extern "C" {
void foo() {
std::cout << inst.v << std::endl;
}
}
Nhưng tôi đã rất ngạc nhiên khi thấy rằng với g ++ 4.6.1 và 4.4.4 Tôi phải viết rõ ràng ::
trong friend void ::foo();
nếu không tình bạn không hoạt động. Tuy nhiên, chỉ cần ::
khi đó là extern "C"
.
- Đây có phải là lỗi/lỗi trình biên dịch không? Tôi đã không mong đợi hành vi đó.
- Nếu nó không phải là lỗi tại sao điều này là bắt buộc, nhưng chỉ khi đó là
extern "C"
và không phải không có nó? Điều gì về các quy tắc tra cứu tên thay đổi mà làm cho điều này cần thiết?
Tôi bị chặn. Có lẽ một số quy tắc cho điều này mà tôi không thể tìm thấy.
(http://codepad.org/Hw7JC8Ky) Và [ở đây] (http://codepad.org/9qVdlrhC) là testcase. –
Hmm là một lỗi sau đó? Tôi không thể tìm thấy bất cứ điều gì trong các quy tắc tra cứu sẽ giải thích tại sao sự kết hợp của 'extern" C "' và nặc danh 'không gian tên' sẽ cần' :: 'nhưng loại bỏ hoặc làm cho nó không cần thiết. Phải thừa nhận rằng mặc dù kiến thức của tôi về các chi tiết tốt hơn về tra cứu tên là mờ và điều này được dựa trên tìm kiếm. – Flexo
@ TomalakGeret'kal - nó không thành công với bất kỳ 'extern" C "' + 'không gian tên', không chỉ là những ẩn danh. – Flexo