Здесь много правильных ответов, но я хотел добавить это (для полноты):
Если вы в нижней части файла cpp реализации выполняете явное инстанцирование всех типов, которые будут использоваться шаблоном с, компоновщик сможет найти их как обычно.
Изменить: добавление примера явного создания экземпляра шаблона. Используется после того, как шаблон определен, и определены все функции-члены.
template class vector<int>;
Это создаст экземпляр (и, следовательно, сделает доступным для компоновщика) класс и все его функции-члены (только). Подобный синтаксис работает для функций шаблона, поэтому, если у вас есть перегрузки операторов, не являющихся членами, вам может понадобиться сделать то же самое для них.
Вышеприведенный пример бесполезен, поскольку вектор полностью определен в заголовках, за исключением случаев, когда common include file (precompiled header?) использует extern template class vector<int>
, чтобы не создавать его из всех других (1000?) файлов, которые используют вектор.
Вы получаете исключение Firebase Context.
java.lang.RuntimeException: You need to set the Android context using Firebase.setAndroidContext() before using Firebase
В зависимости от того, какую версию вы используете, вам необходимо передать контекст приложения в Firebase, как это
public class MyApplication extends android.app.Application {
@Override
public void onCreate() {
super.onCreate();
//Previous versions of Firebase
Firebase.setAndroidContext(this);
//Newer version of Firebase
if(!FirebaseApp.getApps(this).isEmpty()) {
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
}
}
Обновите свой манифест с помощью
<application
android:label="@string/app_name"
android:name=".MyApplication">
...
</application>