带有一元和二进制运算符的模板朋友函数中C ++ 17和C ++ 20的区别

问题描述 投票:8回答:1

我在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 class vec;模板

c++ templates c++17 friend c++20
1个回答
1
投票

这是由于在类上下文中进行名称查找的方式。在朋友声明器中查找名称,就像在任何成员声明器中一样。适用于此处的相关查找规则是:

© www.soinside.com 2019 - 2024. All rights reserved.