Lighthouse собирает каждое изображение BMP, JPEG и PNG на странице, а затем преобразует каждое в WebP. Lighthouse исключает изображение из своего отчета, если потенциальная экономия составляет менее 8 КБ.
blockquote>Также рекомендуется использовать запасные другие браузеры, которые не поддерживают форматы следующего поколения. Одним из таких подходов является использование ссылки Modernizr -> на Google docs
Существует также ответ SO с различными вариантами реализации
]
Первая проблема Вы не можете решить.
Вторая проблема - ничто, чтобы сделать со стандартными классами библиотеки. Это - потому что Вы объявляете экземпляр класса как член Вашего собственного класса.
Обе проблемы происходят из-за требования, чтобы компилятор смог узнать общий размер класса из его определения.
Однако компилятор может разработать размер указателя на класс, даже если он еще не имеет полного определения его. Таким образом, возможное решение в таких случаях состоит в том, чтобы иметь указатель (или ссылка) участник в классе потребления.
Не много справки в случае базового класса, потому что Вы не доберетесь, 'является' отношениями.
И при этом это не стоит делать для чего-то как std::string
. Во-первых, это, как предполагается, удобная обертка вокруг символьного буфера, сохраняет Вас от выполнения управления памятью на чем-то настолько простом. Если Вы затем держите указатель на него, только для предотвращения включая заголовок, Вы, вероятно, берете хорошую идею слишком далеко.
Во-вторых (как указано в комментарии), std::string
определение типа к std::basic_string<char>
. Таким образом, необходимо передать, объявляют (и затем используйте), что вместо этого, которым вещи времени становятся очень неясными и твердыми читать, который является другим видом стоимости. Это действительно стоит того?
Как отвечено прежде Earwicker, Вы не можете использовать предописания ни в одном из тех случаев, поскольку компилятор должен знать размер класса.
Можно только использовать предописание в ряде операций:
Вы не можете использовать его для
(я забывал кого-либо?)
Примите во внимание то объявление auto_ptr
не то же как объявление необработанного указателя, начиная с auto_ptr
инстанцирование попытается удалить указатель, когда это выйдет из объема, и удаление требует полного объявления типа. Если Вы используете auto_ptr
в содержать вперед заявленный тип необходимо будет обеспечить деструктор (даже если пустой), и определите его после того, как полное объявление класса было замечено.
Существует также некоторая другая тонкость. Когда Вы вперед объявляете класс, Вы говорите компилятору, что это будет класс. Это означает, что не может быть enum
или a typedef
в другой тип. Это - проблема, которую Вы получаете, когда Вы пытаетесь передать, объявляют std::string
, поскольку это - определение типа определенного инстанцирования шаблона:
typedef basic_string<char> string; // aproximate
Для передачи объявляют строку, которую необходимо было бы передать, объявляют basic_string
обработайте по шаблону и затем создайте typedef
. Проблема состоит в том, что в стандарте не говорится количество параметров это basic_string
шаблон берет, он просто указывает, что, если требуется больше чем один параметр, там отдых параметров должен иметь тип по умолчанию так, чтобы выражение выше компиляций. Это означает, что нет никакого стандартного пути к тому, чтобы вперед объявить шаблон.
Если, с другой стороны, Вы хотите передать, объявляют нестандартный шаблон (не STL, который является), можно сделать это столько, сколько Вы действительно знаете количество параметров:
template <typename T, typename U> class Test; // correct
//template <typename T> class Test; // incorrect even if U has a default type
template <typename T, typename U = int> class Test {
// ...
};
В конце, совет, который был дан Вам Roddy: вперед объявите столько, сколько Вы можете, но предполагать, что должны быть включены некоторые вещи.
Вы пытаетесь слишком трудно решить что-то, что не является на самом деле проблемой. Используйте заголовочные файлы, в которых Вы нуждаетесь и уменьшаете - ГДЕ ВОЗМОЖНЫЙ - требование для них. Но не пытайтесь взять его к экстремальным значениям, потому что Вы перестанете работать.
В некоторых случаях идиома PIMPL может помочь Вам, но не здесь.
В обоих случаях компилятор должен знать размер типа. Поэтому предописание не будет достаточно. Базовый класс мог добавить участников или потребовать виртуальной таблицы. Строковый участник потребовал бы, чтобы размер класса был увеличением для хранения размера строкового класса STL.
Передайте объявление, что классы STL часто нецелесообразны, так как реализации обычно включают явные шаблонные инстанцирования, которые ускоряют компиляцию.
Для Ваших базовых классов у Вас должно быть полное определение типа, не только объявление. Для заголовков производного типа будет нужен к #include заголовок для их базовых классов.
Для классов в пространстве имен станд. необходимо включать надлежащий заголовок - <строку> в этом случае - и затем сделать одну из 3 вещей:
Полностью определите тип: станд.:: строка aStringToTest
Поместите объявление использования для просто что тип: использование станд.:: строка;
Вставьте объявление использования для пространства имен станд.: использование станд. пространства имен;
> Кажется, что предописание бесполезно для базовых классов и stl классов.
Исправление... Предописание является НЕСООТВЕТСТВУЮЩИМ для базовых классов и элемента объекта. (Это не "бесполезно", это является "неподходящим".)
Базовый класс ДОЛЖЕН быть объявлен (не, передают объявленный), будучи объявленным как основанный класс другого класса.
Элемент объекта ДОЛЖЕН быть объявлен (не, передают объявленный), будучи объявленным другим классом, или как параметр, или как возвращаемое значение.Примечание: ссылкой или указателем не имеет того ограничения.
Исправление... Предописание классов STL - согласно ISO 14882 - неопределенное поведение. http://www.gotw.ca/gotw/034.htm