Оператор разрешения области и зависимое имя - PullRequest
4 голосов
/ 11 октября 2010

У меня есть следующий тестовый код

#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

Ответы [ 2 ]

6 голосов
/ 11 октября 2010

Стандарт говорит о -> и ., но не о ::.

Оператор разрешения области действия (::) является частью квалифицированного -id , на который ссылается "или после спецификатор вложенного имени в квалифицированном-идентификаторе ."

Дополнительный словарный запас в C ++ 0xчасть разрешения до CWG дефект 224 .По сути, определение зависимых имен было изменено:

Решение о том, является ли имя зависимым или независимым, должно основываться на поиске, а не на форме имени: если имя можетбыть найденным в контексте определения и не может быть ничем другим в результате специализации, имя должно быть независимым.

3 голосов
/ 11 октября 2010

Может ли кто-нибудь привести пример, чтобы проиллюстрировать, что означает "но не относится к члену текущего экземпляра" в контексте C ++ 0x?

Не знаюесли это то, что на самом деле ведет себя по-разному между реализацией C ++ 03 и C ++ 0x.

template< typename Q >
struct A {
    template< typename T >
    void f( T );

    void g() {
        this->f< Q >( 5 ); // member of current instantiation is not ambiguous

        A< identity<Q> >().template f< 5 >(); // suppose A is partially 
// specialized on identity. Legal but confusing; need help from template keyword.
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...