希望在命名空间中使用friend函数,但不要使用整个类

want friend function in namespace, but not the whole class

本文关键字:函数 命名空间 friend 希望      更新时间:2023-10-16

这是命名空间中友元函数的后续问题

如果我希望testFunc位于命名空间TestNamespace中,但我不希望TestClass也位于TestNamespace,我如何声明它们?

1.这不起作用(第2行"命名空间前应为非限定id")

class TestClass {
namespace TestNamespace {
    friend void testFunc(TestClass &myObj);
};
}
namespace TestNamespace {
    void testFunc(TestClass &myObj);
}

2.但它抱怨说,当我这样做时,"TestNamespace::testFunc(…)应该在‘TestNamespace’内声明"-

class TestClass {
friend void TestNamespace::testFunc(TestClass &myObj);
}
namespace TestNamespace {
    void testFunc(TestClass &myObj);
}

3.如果我在第2行的友元函数声明中没有"TestNamespace::",那么上面的代码是可以的,但我不确定它是否知道TestNamespace:testFunc是友元。

我不知道这些案件中发生了什么。任何见解都将不胜感激。谢谢

尝试使用前向声明:

class TestClass;
namespace TestNamespace {
    void testFunc(TestClass &myObj);
}
class TestClass {
    friend void TestNamespace::testFunc(TestClass &myObj);
};

我不知道在你最初的例子中"leda"是什么,但希望你能用上面给出的任何名字来代替。

您可以让它变得简单:

class TestClass; // forward declaration
namespace TestNamespace {  // namespace body
    void testFunc(TestClass &myObj);  // passing by reference, ok!
}
class TestClass {
    friend void TestNamespace::testFunc(TestClass &myObj); // scoping with namespace
};

请记住,命名空间主体只能在全局范围内(不能在类或函数内)。