Trong C++ bạn chỉ định liên kết bên trong bằng cách gói các định nghĩa lớp và hàm của bạn bên trong một không gian tên ẩn danh. Bạn cũng có thể nhanh chóng khởi tạo các khuôn mẫu, nhưng để là các tiêu chuẩn phù hợp với bất kỳ sự khởi tạo rõ ràng nào của các khuôn mẫu phải xảy ra trong cùng một không gian tên. AFAICT này nên biên dịch, nhưng GCC không thành công trên nó:Không gian tên vô danh bao gồm tất cả các không gian tên?
namespace foo {
template<class T>
class bar {};
}
using namespace foo;
namespace {
template class bar<int>;
}
int main()
{
return 0;
}
Với các lỗi:
namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace 'foo')
Đó là thú vị bởi vì không gian tên vô danh chỉ nên được xác định mối liên hệ, không thực sự hoạt động như một namespace, và không gian tên toàn cầu chắc chắn bao quanh foo, vì nó bao quanh mọi không gian tên. Nhưng ngay cả điều này không làm việc !:
template<class T>
class bar {};
using namespace foo;
namespace {
template class bar<int>;
}
int main()
{
return 0;
}
nào thất bại với lỗi tương tự, chỉ cần liệt kê các không gian tên toàn cầu thay vì:
namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace '::')
:/
Phiên bản GCC nào - hoặc tùy chọn trình biên dịch nào - hoặc nền tảng nào? Tôi đã thử mẫu đầu tiên với G ++ 4.0.1 trên MacOS X có và không có -Wall và nó được biên dịch mà không có khiếu nại hoặc cảnh báo. –
GCC 4.2 trên Solaris. –