Может ли этот код быть скомпилирован?
#include <iostream>
template <typename T>
struct TMPL
{
using TP = typename T::TP; //is CL::TP visible (with T == CL)?
};
struct CL
{
using TP = int;
TMPL<CL>::TP val;
};
int main()
{
CL cl;
}
TMPL создается непосредственно перед определением класса CL в соответствии со стандартом 14.6.4.1/4.
Для специализации шаблона класса, …, если специализация
создается неявно, потому что на него ссылаются из другого
шаблонная специализация, …. В противном случае точка инстанцирования
для такой специализации непосредственно предшествует область пространства имен
декларация или определение, которое относится к специализации.
Таким образом, CL :: TP не виден в точке создания TMPL, но все компиляторы (MSVC, gcc, clang) прекрасно его компилируют. Я также нашел сообщение о дефекте http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#287, но это, по-видимому, не было принято
Ваш пример не идентичен тому, что в отчет о дефектах. В отчете о дефекте CL
это шаблон класса. Однако цель предлагаемого решения состоит в том, чтобы сделать шаблонный случай таким же, как шаблонный случай, иначе [Basic.scope.pdecl]:
6 После точки объявления члена класса, имя члена
можно посмотреть в рамках своего класса. [ Замечания: это правда
даже если класс неполный класс. Например,struct X { enum E { z = 16 }; int b[X::z]; // OK };
— конечная нота ]
Тогда предлагаемое решение:
В 14.6.4.1 [temp.point] пункт 3 изменить:
точка инстанцирования находится непосредственно перед точкой
создание шаблона. В противном случае точка
создание такой специализации непосредственно предшествует
декларация или определение области имен пространства имен, которые относятся к
специализация.Для того, чтобы:
точка инстанцирования тот же самый как точка
создание шаблона. В противном случае точка
создание такой специализации непосредственно предшествует
ближайшая прилагаемая декларация. [Примечание: точка создания экземпляра все еще находится в области имен, но любые объявления предшествуют точке
инстанцирование, даже если оно не входит в область имен, считается
был замечен.]Добавить следующий пункт 3:
Если неявно конкретизированная специализация шаблона класса, класс
специализация члена или специализация шаблона класса
ссылается на класс, специализация шаблона класса, член класса
специализация или специализация шаблона класса, содержащего
ссылка на специализацию, которая прямо или косвенно вызвала
экземпляры, требования полноты и упорядоченности
ссылки на классы применяются в контексте специализации
ссылка.
По состоянию на последнюю проект, случай без шаблона был и остается в силе. Случай шаблона нет. Однако дефект разработка, Это означает, что шаблон шаблона предназначен для компиляции.
Редакционный: Неофициальный консенсус достигнут в рабочей группе и описан в грубой форме в Предварительной Резолюции, хотя
точная формулировка для изменения еще не доступна.
Других решений пока нет …