Лучший способ определить функцию, которая возвращает экземпляр или ссылку на объект шаблона [duplicate]

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

8
задан Barry 17 June 2015 в 12:27
поделиться

1 ответ

Это называется «имя введенного класса». Правило конкретно исходит от [temp.local]:

Как и обычные (не шаблонные) классы, у шаблонов классов есть имя-инъекции-класс (раздел 9) , Имя injected-class-name может использоваться как имя шаблона или имя . Когда он используется с template-argument-list , в качестве шаблона-аргумента для шаблона template-parameter или в качестве конечного идентификатора в спецификаторе специфицированного типа объявления шаблона класса друга, он относится к самому шаблону класса. В противном случае это эквивалентно имя-шаблона , за которым следуют шаблонные параметры шаблона класса, заключенного в <>.

В рамках специализации шаблона класса или частичного специализация, когда имя injected-class-name используется как имя типа , оно эквивалентно имени шаблона , за которым следует template-arguments специализации шаблона класса или частичной специализации, заключенной в & lt;>. [Пример:

template<template<class> class T> class A { };
template<class T> class Y;
template<> class Y<int> {
    Y* p;                                // meaning Y<int>
    Y<char>* q;                          // meaning Y<char>
    A<Y>* a;                             // meaning A<::Y>
    class B {
        template<class> friend class Y;  // meaning ::Y
    };
};

-end example]

Это в основном для удобства, так что имя класса внутри класса относится к самому классу, а не к внешнему, которое может иметь одно и то же имя. Для шаблонов классов это потенциально экономит много ввода, если у вас длинный список аргументов шаблона.

13
ответ дан Barry 15 August 2018 в 16:01
поделиться
  • 1
    поэтому эквивалентно, что Link & lt; & gt; * next и Link * next? – Makoto 17 June 2015 в 12:20
  • 2
    @Makoto Внутри template <typename E> class Link { ... };, да. – Barry 17 June 2015 в 12:21
Другие вопросы по тегам:

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