У меня есть следующий код тестаоператор разрешения области видимости и зависит имя
#include <iostream>
template <typename T>
struct PS
{
template <typename U>
static void foo()
{
std::cout<<"Some test code";
}
};
template <typename T>
void bar()
{
PS<T>::template foo<T>(); //won't compile without `::template`
}
int main()
{
bar<int>();
}
ISO C++ 03 14.2/4
: говорит
Когда имя шаблона член специализации появляется после. или -> в постфиксном выражении или после вложенного имени-спецификатора в квалифицированном-id, а постфикс-выражение или квалифицированный-ящик явно зависит от параметра-шаблона (14.6.2), имени шаблона должен быть префикс шаблона ключевого слова. В противном случае предполагается, что имя называется не-шаблоном.
Стандарт говорит о ->
и .
, но не о ::
. Это дефект в стандарте C++ 03, или я что-то упускаю? Кто-нибудь, пожалуйста, просветите меня.
Однако формулировка была изменена в N3126
Когда на экране отображается название шаблона члена специализации после . или -> в постфиксном выражении или после специфицированного вложенного имени в квалификационном идентификаторе, а выражение объекта или указателя постфиксного выражения или вложенного имени в квалификационном идентификаторе зависит от шаблона параметр (14.6.2) , но не относится к члену текущего экземпляра (14.6.2.1), имя шаблона члена должно быть , предварительно заданное шаблоном ключевого слова. В противном случае предполагается, что имя называется не-шаблоном.
Может ли кто-нибудь привести пример, чтобы проиллюстрировать, что означает but does not refer to a member of the current instantiation
в контексте C++ 0x?
-PS
Обратите внимание, что использование «квалифицированного идентификатора» в стандарте неверно во многих местах, поэтому лучше не брать его по слову, когда говорит «квалифицированный идентификатор». Например, в следующем объявлении переменной вам нужен ':: template', но спецификатор вложенных имен не отображается в идентификаторе с квалификацией (но вложен в« спецификатор типа »):' typename T :: template alloc a; '. Фактически, использование «квалифицированного идентификатора» в стандарте чаще всего отражает намерение «квалифицированное имя». –