У меня есть следующий тестовый код
#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
: говорит
Когда имя специалиста шаблона участника появляется после. или -> в выражении postfix, или после спецификатора вложенного имени в квалифицированном идентификаторе, а выражение postfix или уточненный идентификатор явно зависит от параметра шаблона (14.6.2), члена имя шаблона должно начинаться с ключевого слова template. В противном случае предполагается, что имя не является шаблоном .
Стандарт говорит о ->
и .
, но не о ::
. Это дефект в стандарте C ++ 03 или я что-то упустил? Кто-нибудь, пожалуйста, просветите меня.
Однако формулировка была изменена в N3126
Когда имя специализации шаблона участника появляется после . или -> в выражении postfx или после вложенного имени-спецификации в квалифицированном идентификаторе, а выражение объекта или указателя пост-x-выражения или вложенного имени-спецификатора в квалифицированном идентификаторе зависит от параметр шаблона (14.6.2) , но не относится к элементу текущего экземпляра (14.6.2.1), имя шаблона элемента должно быть
с префиксом шаблона ключевого слова. В противном случае предполагается, что имя не является шаблоном.
Может ли кто-нибудь привести пример, иллюстрирующий значение but does not refer to a member of the current instantiation
в контексте C ++ 0x?
-PS