Раздел N4296::14.3/3 [temp.arg]
говорит:ограничения доступа для аргументов шаблона
от имени из-шаблона аргумента должен быть доступен в точке, где она используется в качестве шаблона-аргумента. [Примечание: Если имя templateargument доступно в точке, где она используется в качестве templateargument, нет дальнейшего ограничения доступа в в результате конкретизации где соответствующий шаблон-параметр зовут используемый. -end примечание]
Хорошо, давайте рассмотрим следующий пример:
template <class T> class X{
static typename T::S ts;
};
class Y {
private:
class VS{ class S{ }; };
X<VS> x; //1
};
Шаблон аргумент шаблона X
в его конкретизации в //1
является class VS
. Теперь, что стандарт это сказал это:
Имя шаблона-аргумента должен быть доступен в точке, где он используется в качестве шаблона-аргумента.
class VS
доступна в точке //1
, следовательно, требование удерживается. Но, несмотря на то, что Стандарт сказал, что больше нет ограничений доступа, код не компилируется.
Почему код не скомпилирован? Из того, что я могу сказать, основываясь на разделе, который я представил, он должен быть составлен.
Там нет никаких дополнительных ограничений на использование 'Т *. Это не означает, что никаких ограничений на использование «T :: S» не существует. –
@ T.C. Где сказано, что в ограничениях используется 'T'? __Нет больше ограничений доступа в результирующем экземпляре__ –
", где используется соответствующее имя параметра шаблона" –