类内定义的友元函数属于哪个范围?

时间:2014-02-05 15:32:51

标签: c++

class A {
    friend void f() {}
};

// void f() {}  // compile error: redifinition of 'void f()'

int main() {
    f();  // compile error: 'f' is not declared in this scope
}

正如您在上面的示例中所看到的,如果在f的封闭命名空间范围内调用A,编译器就找不到f,这给了我这个想法f不在此范围内。但是当添加具有相同签名的函数的无法定义时,编译器会发出函数重定义的错误,这让我产生了f实际上在此范围内的相反想法。

所以,我很困惑一个类内定义的朋友函数属于哪个范围。

2 个答案:

答案 0 :(得分:6)

它位于包含类的命名空间中。

但是,如果它只在类中声明,那么它只能通过参数依赖查找来实现。所以这可行,参数类型A在周围的命名空间中找到f

class A {
    friend void f(A) {}
};

int main() {
    f(A());    // OK: uses ADL
    ::f(A());  // Error: doesn't use ADL, and can't find the name without it
}

这通常用于重载运算符,无论如何只能由ADL找到。

如果您在命名空间范围内声明而不是重新定义了该函数,那么您的版本将会起作用。

void f();

答案 1 :(得分:-3)

友元函数只应在类中声明,而不是定义。例如。朋友void f();