Шаблонная проблема GCC

Вы можете расширить AutoThrottle промежуточное программное обеспечение, отвечающее за управление задержками, с помощью собственной политики:

# extensions.py

from scrapy.extensions.throttle import AutoThrottle

class ZombieThrottle(AutoThrottle):
    """start throttling when web page dies"""

    def _adjust_delay(self, slot, latency, response):
        """Define delay adjustment policy"""
        if response.status == 500:
            slot.delay = 60  # 1 minute

И включить его вместо используемого по умолчанию в settings.py:

# settings.py
EXTENSIONS = {
    'scrapy.extensions.throttle.AutoThrottle': None,
    'myspider.extensions.ZombieThrottle': 0,
}
8
задан Pieter 23 December 2008 в 19:24
поделиться

3 ответа

GCC является правильным, const_iterator является типом и шаблонным иждивенцем в шаблонном операторе <<, необходимо сказать компилятору, что это - тип и не переменная:

typename std::list<T>::const_iterator
16
ответ дан 5 December 2019 в 06:39
поделиться

Завершать ответ @Pieter, который корректен, еще некоторая информация о том, как обрабатываются шаблоны. В первую очередь, шаблоны только компилируются каждый раз, когда они инстанцируют, так, чтобы, если Вы не инстанцируете шаблона для данного типа затем, код никогда не компилировался.

Теперь при инстанцировании шаблона существует две проверки шагов кода шаблона. Сначала шаблон проверяется для правильности независимо от того, каков тип инстанцирования. Сверяться с более простым для понимания примера:

#include "a.h"

template <typename T> void f( T const & )
{
   T::type x;     // is T::type a type?
};

int main()
{
   A a;
   f( a );
}

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

struct A { // version 1
    typedef int type;
};

struct A { // version 2
    static std::string type;
};
std::string A::type = "A";

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

template <typename T> void f( T const & a )
{
    typename T::type x; // define a variable x of type T::type
}

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

В Вашем случае это немного более спорно, как все (но компилятор) знают что станд.:: список:: const_iterator является типом для любого данного T. Ну, это не должно быть. С точки зрения языка некоторый код мог обеспечить шаблонную специализацию для конкретного типа данных T, который отличается от общего шаблона списка. Компилятор не может знать, могло ли это быть так.

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

5
ответ дан 5 December 2019 в 06:39
поделиться

Я думаю, что это стоит сказать Вам о других разрешениях неоднозначности. Для typename я уже ответил на другой здесь.

Другой является шаблоном.Послушайте:

template<typename T>
struct some {
    template<int V>
    struct other {
        typedef int type;
        static const int value = V;
    };
};

template<typename V>
void doit() {
    typename some<V>::template other<42>::type * int_pointer;
}

Отметьте, как мы должны были использовать и шаблон и разрешения неоднозначности имени типа. Имя типа сказало компилятор

Вещь Вы получаете доступ названный ::type действительно тип. Не делайте умножения, которое неправильно приняло бы ::type статическое значение (целое число или что-то).

Шаблон сказал компилятор

other<42> шаблон, используемый с 42 аргумент. Это не использование сравнения operator> и operator< из other с 42 и что следует (который действительно был бы общей ерундой).

4
ответ дан 5 December 2019 в 06:39
поделиться
Другие вопросы по тегам:

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