C ++ зависимый тип в CRTP (регрессия MSVC2017 v15.7.2?) [Дубликат]

List<String> strings=new ArrayList<String>(){};

while(strings.size() > 0) {

 String str = strings.remove(0);
}
1
задан Sami Kenjat 6 March 2013 в 02:44
поделиться

1 ответ

Во второй версии booboo является зависимым именем , поэтому оно не отображается автоматически в шаблоне. Вы можете либо добавить using typename base<T>::booboo; к производному классу, либо использовать ваше решение typedef, либо сказать typename base<T>::booboo bb = T(1);.

2
ответ дан Kerrek SB 19 August 2018 в 04:51
поделиться
  • 1
    просто для разъяснения, по сути, это означает, что в самом начале компилятор не гарантирует, что не существует специализации шаблона базового класса, которые опускают определение booboo, или, возможно, определяют booboo как функцию или что-то еще. поэтому компилятору нужно сказать, что подразумевается в имени: что он исходит из базового класса и что он является типом. – Cheers and hth. - Alf 6 March 2013 в 02:47
  • 2
    @Kerrek: Не знаете ли вы раздел в стандарте, который описывает / говорит о том, когда типы видны при работе с шаблонами? или это проблема, связанная с реализацией? – Sami Kenjat 6 March 2013 в 02:51
  • 3
    @SamiKenjat: Это 14.6.2, «Зависимые имена», в C ++ 11. В принципе, любое имя справа от ::, если левое является специализированным шаблоном. – Kerrek SB 6 March 2013 в 03:02
  • 4
    Включает ли это методы? как мне кажется, иногда нужно использовать слово «шаблон». при вызове метода шаблона из класса, который также является шаблоном. – Sami Kenjat 6 March 2013 в 03:11
  • 5
    @SamiKenjat: вам нужно указать template для имен шаблонов, typename для имен типов и ничего для имен, подобных значениям. – Kerrek SB 6 March 2013 в 11:04
Другие вопросы по тегам:

Похожие вопросы: