Предположим, ваше объявление вложенного шаблона было немного сложнее:
template <typename T, int I>
struct A {
template <typename S, I>
void f (const A<S, I> &s);
template <typename S, int J>
friend struct A;
// Question 1: why isn't the syntax 'friend struct A<S, J>' ?
// The semantic would stay, since we would like A<S, J> (for ANY S, J combination) to be friend of every A<T, I>..
private:
void g () const {}
};
template <typename T, int I>
template <typename S> // Question 2: Why can't the syntax be 'template <typename T, int I, typename S>' ?
void A<T>::f (const A<S> &s) {
s.g();
}
int main () {
A<bool, 5> abool;
A<char, 7> achar;
abool.f(achar);
}
Внезапно ваше предложение уже не кажется таким разумным или очевидным. Какой набор аргументов идет первым? Предположим, вы использовали C ++ 0x и имели список переменных-переменных?
Что касается объявления друга, имея предлагаемый вами синтаксис (friend struct <S, J>
), вы внезапно заставляете компилятор выводить, что S
и J
подразумеваются как аргументы шаблона и не должны выбираться из некоторого случайного объем. Предположим, кто-то ввел тип S
на том же уровне, что и struct A
? На какую S
будет ссылаться декларация friend struct A<S,J>
? Откуда будет знать компилятор? Разумно ли вводить имя во внешнюю область видимости, чтобы радикально изменить значение объявления во вложенной области видимости?
И если вы имели в виду, что объявление должно иметь в итоге: template <typename S, int J> friend struct A<S, J>
, то почему объявление переадресации шаблона друга должно выглядеть иначе, чем стандартное объявление шаблона? Излишне включать имена переменных шаблона после имени шаблона, если вы уже упомянули их в части template <typename S, int J>
.
Я также думаю, что предложенный вами синтаксис усложнит задачу определения специализации шаблона, потому что вам придется смотреть на другие части кода и соотносить вещи.
Например, шаблонная специализация моей версии A
будет выглядеть так:
template <typename T>
struct A<T, 5> {
};
И, как вы можете видеть, это странно близко к вашему предлагаемому синтаксису прямого объявления друзей, и может быть трудно определить, намереваетесь ли вы указать специализированную версию или нет. Это потребовало бы сопоставления аргументов шаблона с параметрами шаблона, в то время как в настоящее время, если у вас нет параметров шаблона, вы не говорите о специализации.