Этот ответ должен быть довольно коротким и сладким, чтобы ответить (часть) озаглавленного вопроса. Если вы хотите получить более подробный ответ, объясняющий, почему вы должны их там поместить, пожалуйста, перейдите здесь .
Общее правило для размещения typename
в основном, когда вы используете параметр шаблона, и хотите получить доступ к вложенному typedef
или с использованием псевдонима, например:
template
struct test {
using type = T; // no typename required
using underlying_type = typename T::type // typename required
};
Обратите внимание, что это также относится к метафункциям или вещи, которые также принимают общие параметры шаблона. Однако, если предоставленный параметр шаблона является явным типом, вам не нужно указывать typename
, например:
template
struct test {
// typename required
using type = typename std::conditional::type;
// no typename required
using integer = std::conditional::type;
};
Общие правила добавления определителя template
в основном аналогичны, за исключением они обычно включают шаблонные функции-члены (статические или другие) структуры / класса, которые сами шаблоны, например:
Учитывая эту структуру и функцию:
template
struct test {
template
void get() const {
std::cout << "get\n";
}
};
template
void func(const test& t) {
t.get(); // error
}
Попытка доступа t.get
изнутри функции приведет к ошибке:
main.cpp:13:11: error: expected primary-expression before 'int'
t.get();
^
main.cpp:13:11: error: expected ';' before 'int'
Таким образом, в этом контексте вам понадобится ключевое слово template
заранее и вызвать его так:
t.template get
Таким образом, компилятор будет анализировать это правильно, а не t.get < int
.
Откройте database2
с помощью инструмента командной строки sqlite3
и прочитайте определение таблицы с помощью команды .schema t2
. (Альтернативно, используйте любой другой инструмент, который позволяет прочитать определение таблицы.)
Затем откройте database1
, attach другую базу данных с помощью команды:
ATTACH 'database2file' AS db2;
затем создайте таблицу t2
и скопируйте данные с помощью:
INSERT INTO t2 SELECT * FROM db2.t2;
Команда оболочки:
sqlite3 database1
В оболочке SQLite:
sqlite> ATTACH 'database2' AS db2;
sqlite> CREATE TABLE t1 AS SELECT * FROM db2.t2;
Вы можете использовать команду sqlite3 .dump
для вывода вывода дампа в другой db. Он принимает необязательный аргумент с именем таблицы.
db1=~/mydb1.sqlite
db2=~/mydb2.sqlite
t=t2
sqlite3 "$db2" ".dump $t" | sqlite3 "$db1"
Если у вас нет общих таблиц в обеих базах данных, вы можете оставить имя таблицы и скопировать все таблицы.
Если таблицы большие, это может быть медленным, потому что это сделает INSERT. Если они огромны, и это действительно слишком медленно, возможно, .import
будет быстрее. Вы можете попробовать что-то вроде
sqlite3 "$db2" ".schema $t" | sqlite3 "$db1"
sqlite3 "$db2" "SELECT * FROM $t" | sqlite3 "$db1" ".import /dev/stdin $t"