Шаблоны должны использоваться в заголовках, потому что компилятор должен создавать экземпляры разных версий кода в зависимости от параметров, заданных / выведенных для параметров шаблона. Помните, что шаблон не представляет собой код напрямую, а шаблон для нескольких версий этого кода. Когда вы компилируете функцию non-template в файле .cpp
, вы компилируете конкретную функцию / класс. Это не относится к шаблонам, которые могут быть созданы с использованием разных типов, а именно, если при замене параметров шаблона конкретными типами необходимо исправить конкретный код.
Была функция с ключевым словом export
, которая была предназначенный для отдельной компиляции. Функция export
устарела в C++11
и, AFAIK, только один компилятор реализовал ее. Вы не должны использовать export
. Отдельная компиляция невозможна в C++
или C++11
, но, возможно, в C++17
, если понятия в нее входят, мы могли бы иметь некоторый способ отдельной компиляции.
Для отдельной компиляции, которая должна быть достигнута, разделить проверка шаблона тела должна быть возможна. Кажется, что решение возможно с концепциями. Взгляните на этот документ , недавно представленный на совещании по стандартам. Я думаю, что это не единственное требование, поскольку вам все равно необходимо создать код кода шаблона в коде пользователя.
Отдельная проблема компиляции для шаблонов, я думаю, это также проблема, возникающая при миграции на модули, которые в настоящее время работают.
До тех пор, пока это разрешено правилами области видимости, наилучшим подходом является позволить инфраструктуре обрабатывать внедрение свойств и bean-компонентов в другие bean-компоненты.
Так как вам нужен bean-объект с областью приложения внутри bean-объекта сессионной области, вы можете просто определить внедрение следующим образом:
<managed-bean>
<managed-bean-name>Actions</managed-bean-name>
<managed-bean-class>com.utils.actions</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>application</property-name>
<value>#{App}</value>
</managed-property>
</managed-bean>
Чтобы принять внедрение свойства внутри вашего компонента Bean-действия, определите общедоступный выполните следующие действия:
public class actions implements Serializable {
private Application app;
public void setApplication(Application app) {
this.app = app;
}
}
Таким образом, вы можете держать бин приложения в любом месте, где вам это нужно, в классе, не решая его снова и снова, когда вам это нужно. Вы также можете решить, что ссылка на компонент приложения - это слишком много, и вам просто нужны данные. В этот момент вам просто нужно настроить faces-config.xml
и метод получения соответственно, чтобы получить именно это.
<managed-property>
<property-name>allData</property-name>
<value>#{App.allData}</value>
</managed-property>
public class actions implements Serializable {
private static final long serialVersionUID = 1L;
private ArrayList<District> allData;
public void setAllData(ArrayList<District> allData) {
this.allData = allData;
}
}
Теперь два совета.
public class Application implements Serializable {
private static final long serialVersionUID = 1L;
private ArrayList<District> allData;
//public Application(){
// try {
// getAllData();
// } catch (NotesException e) {
// e.printStackTrace();
// }
//}
public ArrayList<District> getAllData() {
if (allData == null) {
try {
allData = // your logic result
} catch (NotesException e) {
throw new FacesException(e);
}
}
return allData;
}
}
Добавьте общедоступный метод к вашему компоненту в области приложения, который другие классы Java могут использовать для доступа к экземпляру этого компонента:
public static Application get() {
FacesContext context = FacesContext.getCurrentInstance();
return (Application) context.getApplication().getVariableResolver().resolveVariable("App");
}
Затем вы можете использовать этот метод для доступа к экземпляру области приложения. bean-компонент из вашего класса Actions, а затем получите доступ к методам и переменным этого bean-компонента:
public class actions {
public Vector<String> getDataForCurrentUser() {
// Access the AL_data arraylist stored in the App application scoped bean
ArrayList<District> m = Application.get().AL_data;
}