【发布时间】:2020-05-08 00:30:22
【问题描述】:
我有一个重载的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 错误?
【问题讨论】:
-
VSC 是一个编辑器,因此它不能成为编译器错误消息的来源。不要在模板定义中使用
class,使用typename
标签: c++ c++11 visual-studio-code