хочу функцию друга в пространстве имен, но не весь класс - PullRequest
3 голосов
/ 10 июня 2011

это дополнительный вопрос к функции друга в пространстве имен

Если я хочу, чтобы testFunc находился в пространстве имен TestNamespace, но я не хочу, чтобы TestClass также находился в TestNamespace, как я могу их объявить?

1.Это не работает («ожидаемый неквалифицированный идентификатор перед пространством имен» в строке 2)

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.Приведенный выше код в порядке, если у меня нет строки «TestNamespace ::» в объявлении функции друга в строке 2, но я не уверен, знает ли он, что TestNamespace :: testFunc является другом.

Я не знаю, что происходит в любом из этих случаев. Любое понимание будет высоко ценится тоже. Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

Попробуйте использовать предварительные объявления:

class TestClass;

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

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

Я не знаю, что такое "leda" в вашем исходном примере, но, надеюсь, вы можете заменить любые имена, которые вам нужны, на приведенные выше.

1 голос
/ 10 июня 2011

Вы можете сделать это просто:

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

Помните, тело пространства имен может быть только в глобальной области видимости (не внутри класса или функции).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...