namespace N {
class C {};
template<typename X>
char const * found(X && x) {
return "found";
}
template<typename, typename X>
char const * notfound(X && x) {
return "not found";
}
}
này định nghĩa một không gian tên N
với một lớp C
và hai mẫu chức năng. found
có một tham số mẫu duy nhất, có thể được suy ra từ đối số hàm. notfound
có tham số mẫu bổ sung không thể được suy ra.ADL không (hoặc không được thực hiện?) Cho chức năng với bổ sung (không suy luận) mẫu tham số
Với mã kiểm tra sau (on ideone):
#include <iostream>
int main() {
N::C object;
std::cout
<< found(object) << std::endl
<< notfound<bool>(object) << std::endl // ERROR
<< notfound<bool, N::C>(object) << std::endl; // ERROR
}
Tôi cho rằng argument dependent lookup sẽ tìm thấy cả hai found
và notfound
qua không gian tên kèm theo trong cùng (đó là N
) của các loại lập luận N::C
.
Tuy nhiên:
prog.cpp: In function ‘int main()’:
prog.cpp:21:6: error: ‘notfound’ was not declared in this scope
<< notfound<bool>(object) << std::endl
^~~~~~~~
prog.cpp:21:6: note: suggested alternative:
prog.cpp:12:15: note: ‘N::notfound’
char const * notfound(X && x) {
^~~~~~~~
(cùng lỗi cho notfound<bool, N::C>(object)
sau khi cho ý kiến ra notfound<bool>(object)
cuộc gọi)
Tại sao notfound
không tìm thấy qua ADL?
Bối cảnh: Tôi đang thực hiện một chức năng get
cho một số lớp wrapper, tất cả trong tất cả tương đối giống với std::get(std::tuple)
. Lớp bao bọc, là một chi tiết thực hiện, sống trong một số không gian tên lib::aspect::part::impl
. Tôi không muốn người dùng của thư viện chỉ định using lib::aspect::part::impl::get
vì lý do hiển nhiên.
Guess Lẽ ra tôi nên đọc toàn bộ trang ... Cảm ơn bạn;) –
@DanielJour tôi argree rằng thật dễ dàng để bỏ qua. Và tôi thấy những giải thích từ tiêu chuẩn có vẻ rõ ràng hơn; Tôi đã sửa lại câu trả lời của mình và hy vọng nó có thể giúp ích nhiều hơn. – songyuanyao
Một phần của lý do là vì '<' là mơ hồ; nó là một khung đối số mẫu hay nhỏ hơn? Giả sử nó là đối số 'std :: size_t'. 'notfound <7> (đối tượng)' là 'notfound <7' theo sau là'> (đối tượng) ' – Yakk