想要在命名空间中使用friend函数,而不是整个类

时间:2011-06-10 03:11:50

标签: c++ function namespaces friend

这是friend function within a namespace

的后续问题

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

1.这不起作用(“第2行的”命名空间之前的预期unqualified-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是朋友。

我不知道在这些案件中发生了什么。任何见解也会非常感激。谢谢!

2 个答案:

答案 0 :(得分:2)

尝试使用前向声明:

class TestClass;

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

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

我不知道你原来的例子中有什么“leda”,但希望你可以用上面提到的任何名字代替。

答案 1 :(得分:1)

你可以简化:

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
};

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