以下代码
#include <cassert>
#include <cstddef>
template <typename T>
struct foo {
foo(std::nullptr_t) { }
//friend bool operator ==(foo lhs, foo rhs) { return true; }
template <typename U>
friend bool operator ==(foo<U> lhs, foo<U> rhs);
};
template <typename T>
inline bool operator ==(foo<T> lhs, foo<T> rhs) { return true; }
int main() {
foo<int> p = nullptr;
assert(p == nullptr);
}
无法编译并显示错误消息
foo.cpp : 18:5: 错误: '
operator==
' 中的 'p == nullptr
'没有匹配 项:模板参数推导/替换失败: foo.cpp:18:5:注意:不匹配的类型' '和' 'template<class T> bool operator==(foo<T>, foo<T>)
foo<T>
std::nullptr_t
但是,如果我改用类中的定义,则代码将按预期工作。
让我说我理解错误信息:模板参数T
不能被推断为类型nullptr
(顺便说一句,decltype(*nullptr)
不编译)。此外,这可以通过在类中定义函数来解决。
但是,出于统一的原因(我需要在外面定义其他友元函数),我想在类之外定义这个函数。
是否有一个“技巧”可以使函数的类外部定义起作用?