我在C ++ 20中具有以下clang++ -std=c++2a
的MWE,在其中定义了类内一元-
运算符和friend
-ed二进制-
运算符:
template<typename T>
class vec;
template<typename T>
vec<T> operator-(const vec<T>&, const vec<T>&);
template<typename T>
class vec {
public:
vec() {}
vec operator-() const { return vec(); }
friend vec operator-<>(const vec&, const vec&);
};
template<typename T>
vec<T> operator-(const vec<T>& lhs, const vec<T>& rhs) { return vec<T>(); }
int main()
{
vec<int> v;
return 0;
}
但是,这会在C ++ 17中导致以下错误:
main.cpp:12:16: error: friends can only be classes or functions
friend vec operator-<>(const vec&, const vec&);
^
main.cpp:12:25: error: expected ';' at end of declaration list
friend vec operator-<>(const vec&, const vec&);
^
;
带有Apple clang version 11.0.3 (clang-1103.0.32.59)
。
当我删除类内的一元运算符或通过-std=c++2a
使用C ++ 20时,错误消失了。>>
是什么在C ++ 17中引起此问题,C ++ 20如何解决此问题?任何帮助将不胜感激!
我在C ++ 20中具有以下CWE,带有clang ++ -std = c ++ 2a,其中我定义了类内一元运算符和友好的二进制运算符:template
这是由于在类上下文中进行名称查找的方式。在朋友声明器中查找名称,就像在任何成员声明器中一样。适用于此处的相关查找规则是: