Объявление «друзей» функций не удается в Visual Studio 2008 - PullRequest
2 голосов
/ 02 июля 2010

Я пытаюсь объявить глобальную функцию как «друга» класса:

namespace first
{
    namespace second
    {
        namespace first
        {
            class Second
            {
                template <typename T> friend T ::first::FirstMethod();
            };
        }
    }
}

Когда я компилирую этот код в Visual C ++ 2008, я получаю:

error C3254: 'first::second::first::Second' : class contains explicit override 'FirstMethod' but does not derive from an interface that contains the function declaration
error C2838: 'FirstMethod' : illegal qualified name in member declaration

Если я использую template <typename T> friend T first::FirstMethod();, вместо этого я получаю:

error C2039: 'FirstMethod' : is not a member of 'first::second::first'

Как правильно объявлять функции друзей?

1 Ответ

5 голосов
/ 02 июля 2010

Вы случайно нажали мой тест - последовательность T ::first:: ... интерпретируется как одиночное имя. Вам нужно положить токен между двоеточиями и T. Решение представлено и в связанном вопросе.

Обратите внимание, что в любом случае вы должны сначала объявить функцию, обозначенную квалифицированным именем, в соответствующем пространстве имен.


Редактировать: Существуют различные решения для проблемы синтаксиса

 template <typename T> friend T (::first::FirstMethod)();
 template <typename T> T friend ::first::FirstMethod();

Если вам часто приходится обращаться к внешнему пространству имен и возникают проблемы с этим синтаксисом, вы можете ввести псевдоним пространства имен

    namespace first
    {
        namespace outer_first = ::first;
        class Second
        {
            template <typename T> friend T outer_first::FirstMethod();
        };
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...