Почему нам нужно имя типа здесь?

Решение на http://www.phinesolutions.com/use-jquery-to-adjust-the-iframe-height.html работает отлично (использует jQuery):


я не знаю, что необходимо добавить 30 к длине... 1 работал на меня.

к вашему сведению : Если у Вас уже есть атрибут "высоты" на Вашем iFrame, это просто добавляет стиль = "высота: xxx". Это не могло бы быть тем, что Вы хотите.

15
задан 14 July 2009 в 02:12
поделиться

4 ответа

В общем, C ++ нуждается в typename из-за неудачного синтаксиса [*], который он наследует от C, что делает невозможным без нелокальной информации сказать - например - в A * B; указывает, называет ли A тип (в этом случае это объявление B как указатель на него) или нет (в в этом случае это выражение умножения - вполне возможно, поскольку A , насколько вы можете сказать без нелокальной информации, может быть экземпляром класса, который перегружает оператор * для выполнения что-то странное; -).

В большинстве случаев у компилятора действительно есть нелокальная информация, необходимая для устранения неоднозначности (хотя неудачный синтаксис по-прежнему означает, что низкоуровневому синтаксическому анализатору требуется обратная связь от более высокого уровня, который хранит информацию таблицы символов ) ...но с шаблонами это не так (не в общем, хотя в этом конкретном случае может быть технически незаконным специализировать std :: list так, чтобы его :: iterator НЕ является именем типа; -).

[*] не только мое мнение, но и мнение Кена Томпсона и Роба Пайкса, в настоящее время моих коллег, которые заняты разработкой и реализацией нового языка программирования для внутреннего использования: этот новый язык программирования, хотя его синтаксис в основном Подобно C, НЕ повторяет ошибки проектирования синтаксиса C - это новый язык (например, в старом добром Паскале), синтаксиса достаточно, чтобы отличить идентификаторы, которые должны называть тип, от идентификаторов, которые не должны; -).

21
ответ дан 1 December 2019 в 01:31
поделиться

Компаратор rlbond не предотвращает вставку элементов, которые сравнивают равные. Очевидно, это трудно доказать в комментариях, учитывая ограничение на количество символов, потому что rlbond, похоже, думает, что std :: set гарантирует, что он никогда не будет содержать двух элементов с ! Compare (a, b) &&! Compare (b, a ) для своего компаратора. Однако компаратор rlbond не определяет строгий порядок и поэтому не является допустимым параметром для std :: set.

#include <set>
#include <iostream>
#include <iterator>
#include <algorithm>

struct BrokenOrder {
    int order;
    int equality;

    public:
    BrokenOrder(int o, int e) : order(o), equality(e) {}

    bool operator<(const BrokenOrder &rhs) const {
        return order < rhs.order;
    }
    bool operator==(const BrokenOrder &rhs) const {
        return equality == rhs.equality;
    }
};

std::ostream &operator<<(std::ostream &stream, const BrokenOrder &b) {
    return stream << b.equality;
}

// rlbond's magic comparator
struct LessThan : public std::binary_function<BrokenOrder, BrokenOrder, bool> {
    bool operator()(const BrokenOrder& lhs, const BrokenOrder& rhs) const
    {
        return !(lhs == rhs) && (lhs < rhs);
    }
};

int main() {
    std::set<BrokenOrder,LessThan> s;
    for (int i = 0; i < 5; ++i) {
        s.insert(BrokenOrder(i,i));
    }
    for (int i = 0; i < 5; ++i) {
        s.insert(BrokenOrder(10-i,i));
    }
    std::copy(s.begin(), s.end(), 
        std::ostream_iterator<BrokenOrder>(std::cout, "\n"));
}

Вывод:

0
1
2
3
4
3
2
1
0

Дубликаты. Сбой магического компаратора. Различные элементы в наборе имеют одинаковое значение равенства и, следовательно, сравнивают то же самое с operator == , потому что во время вставки набор никогда не сравнивал новый элемент с его дубликатом. Единственный дубликат, который был исключен, - 4, потому что два 4 ' Без typename std :: list :: iterator будет считаться статическим членом. typename используется всякий раз, когда имя, зависящее от параметра шаблона, является типом.

12
ответ дан 1 December 2019 в 01:31
поделиться

Я думаю, что в целом вам нужны как имя типа / класс T в объявлении класса, так и определения функций, потому что вы можете определять полные / частичные спецификации шаблона для определений функций. Т.е. вы можете специализировать свою функцию удаления для целых чисел, строк и т.д. Итак, в этом случае вы говорите компилятору: «Это общий шаблон для любого типа», а затем вы можете определить ту же функцию, указанную только для целых чисел.

1
ответ дан 1 December 2019 в 01:31
поделиться

имя_типа необходимо в вашем объявлении 'it', потому что в противном случае компилятор не узнает, что это объявление типа, а не выражение.

Согласно эта страница ], «Используйте ключевое слово typename, если у вас есть полное имя, которое относится к типу и зависит от параметра шаблона.»

1
ответ дан 1 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

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