Tôi đã dành một chút thời gian để hiểu tại sao mã của tôi không biên dịch và tôi đã nhận ra rằng trong C++ Tra cứu phụ thuộc đối tượng sử dụng tên tệp mẫu đối số để xác định phạm vi tra cứu tên.Lý do căn bản đằng sau ADL cho các đối số có loại là chuyên môn mẫu lớp
#include <string>
#include <functional>
namespace myns {
template<typename T>
struct X
{};
template<typename T>
auto ref(T) -> void
{}
} // namespace myns
auto main() -> int
{
ref(myns::X<int>{});
ref(myns::X<std::string>{}); // error: call to 'ref' is ambiguous
}
Vì vậy, các cựu gọi ref biên dịch, bởi vì đối với myns::X<int>
chỉ myns::ref
được coi là, trong khi sau này không biên dịch vì nó tìm thấy myns::ref()
cũng như std::ref
Câu hỏi của tôi là thế nào điều này có thể hữu ích? Tại sao tôi cần điều này? Bạn có bất kỳ ý tưởng, ví dụ? Bây giờ tôi chỉ có thể thấy những hạn chế như trong ví dụ trên, nơi nó giới thiệu sự mơ hồ không cần thiết.
Bạn có cần chức năng của mình để chấp nhận * bất kỳ * loại nào không? Nếu không 'auto ref (X) -> void' sẽ phù hợp hơn' std :: ref' và được chọn bởi độ phân giải quá tải. –
Thật không may, tôi có. – witosx