2013-07-07 1 views
4

лязг 3.0 и г ++ 4.8.1 и отвергают следующий код с ошибкой, показанной в комментарии:Должен ли поиск имени отложить для класса/namespace-name, присвоенного этим-> в определении шаблона класса?

template<typename T> 
struct S 
{ 
    void f() 
    { 
     this->dependent(); // no error: type of 'this' is dependent? 
     this->Dependent::dependent(); // error: 'Dependent' has not been declared 
    } 
}; 

Согласно [basic.lookup.classref]

имя-класса или -namespace-name, следующее за. или -> отображается как в контексте всего постфиксного выражения, так и в области класса выражения объекта.

И [temp.dep.expr]

this является типом-зависимым, если тип класса вмещающего функции члена зависит.

Если--пространство имен имя класса или Dependent ищется «в области видимости класса выражения объекта * this, и класс выражения объекта зависит, не следует этот поиск не может быть отложен до тех пор, шаблон создается? Указывает ли стандарт на правильное поведение?

EDIT: лязг 3,0 принимает следующий код, но г ++ 4.8 дает ту же ошибку, как выше

template<typename T> 
struct S 
{ 
    T m; 
    void f() 
    { 
     m.dependent(); 
     m.Dependent::dependent(); 
    } 
}; 
+0

Я не вижу, как 'this-> Dependent :: dependent()' может быть зависимым выражением. Как это зависит от параметра шаблона? – mfontanini

+0

[temp.dep.expr] "' this' зависит от типа, если тип класса функции-член-член зависит ". – willj

+0

Второй код делает ощущение, поскольку оно может зависеть от шаблона, но не первого. Для меня как первый, так и второй код компилируются отлично на clang3, g ++ 4.8.1 и msvc_110, если, конечно, я не пытаюсь создать экземпляр первого кода –

ответ

2

В вашем первом коде, обе линии не «неверный формат, не диагностики требуется», потому что " это »относится к текущему экземпляру, но ни один элемент не найден, а шаблон класса не имеет зависимых базовых классов.

Это не член текущей инстанции или неизвестной специализации. См. 14.6.2.1p6

+0

Какая версия стандарта вы цитируете? Я предполагаю, что этот язык был добавлен с C++ 03. – willj

+0

Это было добавлено в C++ 11 –

+0

@willj даже в C++ 03 оно было «неформальным, NDR», однако для него не было конкретного правила, просто общее «если не может быть создана действительная специализация, шаблон плохо «НДР». Теперь у нас есть конкретные правила. –

 Смежные вопросы

  • Нет связанных вопросов^_^