2015-07-18 5 views
1

Раздел 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 
}; 

DEMO

Шаблон аргумент шаблона X в его конкретизации в //1 является class VS. Теперь, что стандарт это сказал это:

Имя шаблона-аргумента должен быть доступен в точке, где он используется в качестве шаблона-аргумента.

class VS доступна в точке //1, следовательно, требование удерживается. Но, несмотря на то, что Стандарт сказал, что больше нет ограничений доступа, код не компилируется.

Почему код не скомпилирован? Из того, что я могу сказать, основываясь на разделе, который я представил, он должен быть составлен.

+1

Там нет никаких дополнительных ограничений на использование 'Т *. Это не означает, что никаких ограничений на использование «T :: S» не существует. –

+0

@ T.C. Где сказано, что в ограничениях используется 'T'? __Нет больше ограничений доступа в результирующем экземпляре__ –

+0

", где используется соответствующее имя параметра шаблона" –

ответ

2

S является частным, попробуйте следующее:

template <class T> class X{ 
    static typename T::S ts; 
}; 

class Y { 
private: 
    class VS{ public: class S{ }; }; 
    X<VS> x; //1 
}; 
Смежные вопросы