У меня перегружено operator<<
для std::chrono::duration
. Насколько я понимаю, я должен поместить это в пространство имен std::chrono
, чтобы ADL работал. Однако, по какой-то причине, когда я делаю это, все другие ссылки на std::chrono::duration
помечаются VSCode как ambiguous
. Это может быть просто ошибка VSCode, но она использует clangd
для проверки правильности, поэтому мне интересно, действительно ли что-то не так с моим кодом. Он компилируется , но VSCode не использует точно то же самое clang
, с которым я компилирую, так что, возможно, мой просто более разрешительный?
Самый маленький пример, который я мог бы придумать, :
#include <chrono>
#include <iostream>
// marks chrono as ambiguous
using std::chrono::milliseconds;
namespace std {
namespace chrono {
// again marks chrono as ambiguous
template <class U, class T>
std::ostream& operator<<(std::ostream& os, const typename ::std::chrono::duration<U, T>& dur) {
os << "foo";
return os;
}
} // namespace chrono
} // namespace std
namespace example {
void DoThing() {
// NOT marked as ambiguous
milliseconds x(10);
// Says no match for operator<< and milliseconds
std::cout << x;
}
} // namespace example
Похоже ли это кому-то, что это недопустимо в C ++ или это более вероятно ошибка clangd
или VSCode?