нужна функция друга в пространстве имен, но не весь класс

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

Если я хочу, чтобы 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 является другом.

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


person Lavanya    schedule 10.06.2011    source источник


Ответы (2)


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

class TestClass;

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

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

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

person John Zwinck    schedule 10.06.2011
comment
Спасибо! Форвардные объявления — это здорово :) - person Lavanya; 10.06.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
};

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

person iammilind    schedule 10.06.2011