IE 6 поддерживает только псевдокласс : hover
на ссылки, но IE 7 поддерживает его на большинстве элементов.
Как сказал Дэвид, это может не работать в режиме причуд. Тогда причиной будет то, что IE в основном возвращается к чему-то ближе к IE 4 в режиме причуд, позволяя много специфичных для IE функций и удаляя несколько совместимых со стандартами функций.
Если требуется функция : наведение
на элемент блока и поддержка обратно в IE 6, можно использовать элемент ссылки и сделать его элементом блока с помощью CSS. Обратите внимание, что ссылка может содержать только встроенные элементы (например, no div
s), так что если вы хотите блокировать элементы внутри ссылки, вам придется установить, что с помощью CSS также:
CSS:
.hoverlink { display: block; }
.hoverlink:hover { background: #eee; }
.hoverlink .item { display: block; }
HTML:
<a href="..." class="hoverlink">
<span class="item">Line 1</span>
<span class="item">Line 2</span>
<span class="item">Line 3</span>
</a>
(Вы можете рассмотреть влияние на поисковые системы с помощью метода также. Ссылка имеет большее влияние, если она содержит только текст, описывающий, с чем она связана.)
-121--4716575-Как правило, использование контейнеров STL таким образом небезопасно. Для обеспечения безопасности потока кода необходимо внедрить конкретный метод. Выбор решения зависит от ваших потребностей. Я бы, наверное, решил это, сохранив два списка, по одному в каждом потоке. И передача изменений через блокирующую свободную очередь (упомянутую в комментариях к этому вопросу). Можно также ограничить время жизни объектов Info, заключив их в boost::shared_ptr, например,
typedef boost::shared_ptr<Info> InfoReference;
typedef std::list<InfoReference> InfoList;
enum CommandValue
{
Insert,
Delete
}
struct Command
{
CommandValue operation;
InfoReference reference;
}
typedef LockFreeQueue<Command> CommandQueue;
class Thread1
{
Thread1(CommandQueue queue) : m_commands(queue) {}
void run()
{
while (!finished)
{
//Process Items and use
// deleteInfo() or addInfo()
};
}
void deleteInfo(InfoReference reference)
{
Command command;
command.operation = Delete;
command.reference = reference;
m_commands.produce(command);
}
void addInfo(InfoReference reference)
{
Command command;
command.operation = Insert;
command.reference = reference;
m_commands.produce(command);
}
}
private:
CommandQueue& m_commands;
InfoList m_infoList;
}
class Thread2
{
Thread2(CommandQueue queue) : m_commands(queue) {}
void run()
{
while(!finished)
{
processQueue();
processList();
}
}
void processQueue()
{
Command command;
while (m_commands.consume(command))
{
switch(command.operation)
{
case Insert:
m_infoList.push_back(command.reference);
break;
case Delete:
m_infoList.remove(command.reference);
break;
}
}
}
void processList()
{
// Iterate over m_infoList
}
private:
CommandQueue& m_commands;
InfoList m_infoList;
}
void main()
{
CommandQueue commands;
Thread1 thread1(commands);
Thread2 thread2(commands);
thread1.start();
thread2.start();
waitforTermination();
}
Это не было скомпилировано. Необходимо обеспечить безопасность доступа к объектам Info
.
Это измененная версия другого ответа, который я написал на ту же тему. До версии 3.
Основной проблемой является конфликт имен, так как если в коде есть переменная с именем count
и вы используете пространство имен std;
это будет неоднозначно относительно того, что вы имеете в виду. Это не просто число
. Также будут включены обратные
и равные
, которые являются общими идентификаторами. Например, это приведет к ошибке компиляции:
#include <algorithm>
using namespace std;
int count;
int main(int argc, char* argv[]){
count = 1;
}
Игнорирование всех проблем компилятора, это также проблема для любого, кто придет прочитать ваш код. Эти дополнительные 5 символов гарантируют, что следующий пользователь, поддерживающий ваш код, точно знает, что вы имеете в виду, не проверяя верхнюю часть файла каждую другую строку, чтобы узнать, имеете ли вы в виду std:: Последовательность
или mylib:: Последовательность
при записи последовательностей
Также стоит отметить, что никогда не следует помещать с помощью namspace xyz
в файл заголовка, поскольку он может распространяться на все файлы, содержащие этот файл заголовка, даже если они не хотят использовать это пространство имен. Другая проблема здесь заключается в том, что также не ясно, что пространство имен std было импортировано, поэтому сопровождающий (или вы через 3 месяца) добавляет переменную с тем же именем, что и какая-то неясная функция std, которая была включена в ту же самую единицу компиляции, а затем тратит час на поиск причины ошибки компиляции.
(From Effective C++) В большинстве случаев очень выгодно использовать
using std::swap
Как и при наличии специализированной версии свопа, компилятор будет использовать это, в противном случае он обратится к std:: swap
. При вызове std:: swap
всегда используется базовая версия, которая не вызывает специализированную версию (даже если она существует).
Возьмем, например, код с помощью идиома pimpl . Где в качестве копии по умолчанию могут быть скопированы все данные в фактической реализации, где, как все, что требуется, это замена указателей. Использование специализированного свопа может сэкономить огромное количество времени выполнения, и хорошо разработанные библиотеки должны специализировать его.
В итоге,
Всегда предпочитайте использование std:: swap
по сравнению с std:: swap ()
Избегайте использования пространства имен std
в заголовке любой ценой из-за распространения, старайтесь избегать его использования в файлах реализации.
Наличие тысяч с использованием std:: foo
в верхней части каждого файла - это не путь. В большинстве случаев используется для часто используемых классов.
Все остальное - это мнение.
в файлах cpp нормально. Вы предпочитаете второй синтаксис в заголовках, чтобы они не распространялись по всему проекту.
-121--4321216-Я думаю, что ваш выбор, вероятно, будет зависеть от того, сколько вызовов API вы намерены сделать в день. Ежедневный лимит бесплатного API Google Maps составляет 15 000 запросов на один IP-адрес. (Источник: Часто задаваемые вопросы по API-интерфейсу Google Maps .)
Геокодирование можно выполнить с помощью API-интерфейса Google Maps с помощью следующего HTTP-запроса:
Простой CSV:
http://maps.google.com/maps/geo?q=W1A+1AA,+London&output=csv&sensor=false
Более сложный XML:
http://maps.google.com/maps/geo?q=W1A+1AA,+London&output=xml&sensor=false
Просто измените параметр «q» с почтовым кодом и страной на геокод.
Однако я думаю, что постоянное хранение результатов геокодирования в вашей базе данных может быть нарушением условий и положений API Google Maps. Вы можете узнать больше об этих ограничениях.
-121--2975593- Лично я предпочитаю использование объявления
, а не использование директивы
.
Например:
#include<string>
using std::string;
string x="abc";
Использование директивы с помощью
приводит все пространство имен в область, что может привести к проблемам со столкновением имен.
Для получения дополнительной информации см. this (настоятельно рекомендуется).
IE 6 поддерживает только псевдокласс : hover
на ссылки, но IE 7 поддерживает его на большинстве элементов.
Как сказал Дэвид, это может не работать в режиме причуд. Тогда причиной будет то, что IE в основном возвращается к чему-то ближе к IE 4 в режиме причуд, позволяя много специфичных для IE функций и удаляя несколько совместимых со стандартами функций.
Если требуется функция : наведение
на элемент блока и поддержка обратно в IE 6, можно использовать элемент ссылки и сделать его элементом блока с помощью CSS. Обратите внимание, что ссылка может содержать только встроенные элементы (например, no div
s), так что если вы хотите блокировать элементы внутри ссылки, вам придется установить, что с помощью CSS также:
CSS:
.hoverlink { display: block; }
.hoverlink:hover { background: #eee; }
.hoverlink .item { display: block; }
HTML:
<a href="..." class="hoverlink">
<span class="item">Line 1</span>
<span class="item">Line 2</span>
<span class="item">Line 3</span>
</a>
(Вы можете рассмотреть влияние на поисковые системы с помощью метода также. Ссылка имеет большее влияние, если она содержит только текст, описывающий, с чем она связана.)
-121--4716575-Как правило, использование контейнеров STL таким образом небезопасно. Для обеспечения безопасности потока кода необходимо внедрить конкретный метод. Выбор решения зависит от ваших потребностей. Я бы, наверное, решил это, сохранив два списка, по одному в каждом потоке. И передача изменений через блокирующую свободную очередь (упомянутую в комментариях к этому вопросу). Можно также ограничить время жизни объектов Info, заключив их в boost::shared_ptr, например,
typedef boost::shared_ptr<Info> InfoReference;
typedef std::list<InfoReference> InfoList;
enum CommandValue
{
Insert,
Delete
}
struct Command
{
CommandValue operation;
InfoReference reference;
}
typedef LockFreeQueue<Command> CommandQueue;
class Thread1
{
Thread1(CommandQueue queue) : m_commands(queue) {}
void run()
{
while (!finished)
{
//Process Items and use
// deleteInfo() or addInfo()
};
}
void deleteInfo(InfoReference reference)
{
Command command;
command.operation = Delete;
command.reference = reference;
m_commands.produce(command);
}
void addInfo(InfoReference reference)
{
Command command;
command.operation = Insert;
command.reference = reference;
m_commands.produce(command);
}
}
private:
CommandQueue& m_commands;
InfoList m_infoList;
}
class Thread2
{
Thread2(CommandQueue queue) : m_commands(queue) {}
void run()
{
while(!finished)
{
processQueue();
processList();
}
}
void processQueue()
{
Command command;
while (m_commands.consume(command))
{
switch(command.operation)
{
case Insert:
m_infoList.push_back(command.reference);
break;
case Delete:
m_infoList.remove(command.reference);
break;
}
}
}
void processList()
{
// Iterate over m_infoList
}
private:
CommandQueue& m_commands;
InfoList m_infoList;
}
void main()
{
CommandQueue commands;
Thread1 thread1(commands);
Thread2 thread2(commands);
thread1.start();
thread2.start();
waitforTermination();
}
Это не было скомпилировано. Необходимо обеспечить безопасность доступа к объектам Info
.
в файлах cpp нормально. Вы предпочитаете второй синтаксис в заголовках, чтобы они не распространялись по всему проекту.