想要命名空间中的朋友功能,而不是整个类

问题描述

| 这是命名空间中对朋友函数的后续问题 如果我想将testFunc放在名称空间TestNamespace中,但又不想在TestNamespace中使用TestClass,如何声明它们? 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
};
请记住,名称空间主体只能在全局范围内(不能在类或函数内部)。