问题描述
|
这是命名空间中对朋友函数的后续问题
如果我想将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
};
请记住,名称空间主体只能在全局范围内(不能在类或函数内部)。