Существует конфликт между 3DMol jquery и блестящей JQuery.
Если вы запускаете скрипт nojquery, он работает:
теги $ head (теги $ script (src = "http://3Dmol.csb.pitt.edu/build/3Dmol-nojquery.js") )
Это " явное "ключевое слово".
template <typename T>
struct foo
{
explicit foo(T const *)
{
}
};
template <typename T>
struct bar
{
bar(T const *)
{
}
};
int main(int argc, char **argv)
{
int a;
foo<int> f = &a; // doesn't work
bar<int> b = &a; // works
}
"явное" Ключевое слово предотвращает использование конструктора для неявных преобразований типов. Рассмотрим следующие два прототипа функций:
void baz(foo<int> const &);
void quux(bar<int> const &);
Используя эти определения, попробуйте вызвать обе функции с указателем int:
baz(&a); // fails
quux(&a); // succeeds
В случае quux ваш указатель int был неявно преобразован в столбец.
EDIT: Чтобы подробнее рассказать о комментариях других людей, рассмотрим следующий (довольно глупый) код:
void bar(std::auto_ptr<int>);
int main(int argc, char **argv)
{
bar(new int()); // probably what you want.
int a;
bar(&a); // ouch. auto_ptr would try to delete a at the end of the
// parameter's scope
int * b = new int();
bar(b);
*b = 42; // more subtle version of the above.
}
Вам необходимо использовать
auto_ptr<Table> table = auto_ptr<Table>(db->query("select * from t"));
auto_ptr не определяет оператор присваивания для своего типа шаблона. Единственное допустимое назначение - из другого auto_ptr (и его конструктор из указателя является явным). Это сделано для защиты случайного неправильного использования auto_ptr, так как auto_ptr предполагает владение памятью.
Я предполагаю, что вам нужна форма назначения для использования нескольких запросов после другого, например:
// initialize using constructor
auto_ptr<Table> table(db->query("select * from t1"));
...
// new query using assignment
table = auto_ptr<Table>(db->query("select * from t2"));
...
// another query using assignment
table = auto_ptr<Table>(db->query("select * from t3"));
Конструктор объявлен как явный, что означает, что он не будет использоваться для неявного преобразования типов. Неявное преобразование в auto_ptr может легко привести к нежелательным ситуациям, поскольку auto_ptr становится владельцем указателя.
Например, если auto_ptr допускает неявное преобразование из указателя, и вы случайно передали указатель на метод, принимающий auto_ptr, указатель будет автоматически преобразован в auto_ptr и впоследствии удален при завершении функции, даже если это не так. намерение. Но помечая конструктор как явное преобразование, больше не может происходить тихо, и вызывая конструктор, вы четко выражаете намерение передать право собственности на auto_ptr, тем самым избегая любой потенциальной путаницы.
void fun(std::auto_ptr<Foo> foo) // Assume implicit conversion is allowed.
{
// do stuff with foo
}
Foo *foo = new Foo();
f(foo); // Normally this isn't allowed.
foo->bar(); // Oops
Добавление к сказанному Лотаром: поскольку конструктор auto_ptr
объявлен с явным выражением Ключевое слово
, вам нужно использовать явное приведение, чтобы создать auto_ptr
из необработанного указателя. (До введения явного
неявное приведение было проклятием многих новых и опытных разработчиков C ++.)