Шаблон друг и вложенные классы - PullRequest
2 голосов
/ 21 июля 2010

пожалуйста, обратите внимание на следующий код:

template <typename T>
struct foo
{
    template <typename S>
    struct bar
    {
        template <typename> friend struct bar;
    };
};

Я бы хотел, чтобы все экземпляры foo<T>::bar были друзьями foo<T>::bar<S> для любого S. Если bar не является вложенным шаблоном, приведенный выше синтаксис работает просто отлично. Но когда я делаю например

int main() 
{  
    foo<int> x;
}

MSVC8 (Visual C ++ 2005) не нравится:

1>.\main.cpp(11) : error C3855: 'foo<T>::bar': template parameter 'S' is incompatible with the declaration
1>        .\main.cpp(12) : see reference to class template instantiation 'foo<T>::bar<S>' being compiled
1>        .\main.cpp(14) : see reference to class template instantiation 'foo<T>' being compiled

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

template <typename> friend struct foo<T>::bar;

вместо этого. Как мне добиться того, чего я хочу?

РЕДАКТИРОВАТЬ: Я дважды проверил (здесь утро, и я не совсем проснулся), это, похоже, ошибка VC8 :

1 Ответ

2 голосов
/ 21 июля 2010

Все ограничения для друга класса или шаблона класса описаны в разделе 14.5.3 Стандарта C ++.Ваш код действителен.Убедитесь, что вы установили все последние пакеты обновлений для Visual Studio. Здесь вы можете найти связанные ошибки в Visual Studio.

...