Почему я не могу подружиться с параметром шаблона? - PullRequest
6 голосов
/ 17 июня 2009

При поиске ответа на вопрос (на основе этого ответа ) я пытался сделать следующее:

template <class T>
class friendly {
    friend class T;
};

friendly<string> howdy;

Это не компилируется со следующей ошибкой:

ошибка: параметр шаблона "T" нельзя использовать в разработанный спецификатор типа друг класс Т;

Из того, что я могу понять от моего хорошего друга Google, это так, что я не буду случайно пытаться создать экземпляр friendly<int>, но почему это должно быть ошибкой при компиляции шаблона? Разве это не должно быть ошибкой при создании экземпляра шаблона с недопустимым типом (например, если бы я написал int f() { return T::foo(); })

Ответы [ 2 ]

3 голосов
/ 17 июня 2009

Раздел 7.1.5.3 стандарта в явной форме описывает это как пример плохо сформированного разработанного спецификатора типа.

Дискуссию на эту тему можно найти здесь .

2 голосов
/ 18 июня 2009

Введено немного больше гуглинга Расширенные friend Объявления (PDF) для C ++ 0x .

Этот документ содержит следующее:

template <typename T> class R {
    friend T;
};
R<C> rc; // class C is a friend of R<C>
R<int> ri; // OK: “friend int;” is ignored

Что идет даже дальше, чем я думал (игнорируя незаконные friend замедления, а не провал во время реализации). Так что я думаю, что ответ в том, что нет веской причины, и она исправляется.

...