模板友元运算符重载必须先于同一运算符的成员函数重载吗?

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

有人知道为什么会这样编译吗:

template<typename T>
class Foo;

template<typename T>
bool operator==(const T& l, const Foo<T>& r); 

template<typename T>
class Foo 
{
public:
    Foo();
    ~Foo();

    friend bool operator== <> (const T& l, const Foo<T>& r); 

    bool operator==(const Foo<T>& r);
};

但这不是(唯一的区别是成员与好友操作员的顺序==):

template<typename T>
class Foo;

template<typename T>
bool operator==(const T& l, const Foo<T>& r); 

template<typename T>
class Foo 
{
public:
    Foo();
    ~Foo();

    bool operator==(const Foo<T>& r);

    friend bool operator== <> (const T& l, const Foo<T>& r); 
};

我对第二种情况感到头疼,在朋友热线中出现了“错误:‘operator==’声明为非函数”。我最终决定在朋友声明之前一定有问题,所以我尝试在代码中将其向上移动,看看是否会得到不同的错误。你瞧,当我将其移到成员声明上方时,一切正常!

c++ templates operator-overloading friend
1个回答
0
投票

声明

friend bool operator== <> (const T& l, const Foo<T>& r);

不适用于您在类上方声明的非成员函数。

那个

friend
声明应该看起来像这样

template<typename U>
friend bool operator==(const T& l, const Foo<U>& r); 

有了这个,您不需要

Foo
或非成员
operator==
函数的前向声明。

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