Когда я получаю эту ошибку, я внедряю все сервисы, используя библиотеку для этой проблемы. Попробуйте, может быть, это поможет вам. @ Mtdavem
public class ServiceGenerator {
public static String PREF_COOKIES = "pref_cookies";
private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
private static Retrofit.Builder builder;
public static <S> S createService(Class<S> serviceClass) {
return createService(serviceClass, null);
}
public static <S> S createService(Class<S> serviceClass, final HashMap<String, String> headers) {
builder = new Retrofit.Builder()
.baseUrl("your service address")
.addConverterFactory(GsonConverterFactory.create());
httpClient.sslSocketFactory(getSSLSocketFactory());
httpClient.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
OkHttpClient client = httpClient.build();
Retrofit retrofit = builder.client(client).build();
return retrofit.create(serviceClass);
}
private static SSLSocketFactory getSSLSocketFactory() {
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
return sslSocketFactory;
} catch (KeyManagementException | NoSuchAlgorithmException e) {
return null;
}
}
}
Можно полностью специализировать участника выборочно:
template<int N>
struct Vector {
int calculate() { return N; }
};
// put into the .cpp file, or make inline!
template<>
int Vector<3>::calculate() { return -1; }
Вы делаете полную специализацию. Значение Вас не может неравнодушный специализировать его:
template<int N, int P>
struct Vector {
int calculate() { return N; }
};
// WROOONG!
template<int N>
int Vector<N, 3>::calculate() { return -1; }
При необходимости в этом можно использовать enable_if:
template<int N, int P>
struct Vector {
int calculate() { return calculate<P>(); }
private:
// enable for P1 == 3
template<int P1>
typename enable_if_c<P1 == P && P1 == 3, int>::type
calculate() { return -1; }
// disable for P1 == 3
template<int P1>
typename enable_if_c<!(P1 == P && P1 == 3), int>::type
calculate() { return N; }
};
Альтернативный подход должен разделить Ваш материал (общий материал в базовый класс, и специализированный материал в производный класс) как Nick рекомендует.
Я обычно проявлял бы второй подход. Но я предпочитаю первый, если я не должен к частичному специализировать функции.
Я использовал базовые классы обычно, когда эта ситуация возникает. Т.е.: поместите общую функциональность в базовый класс, и получите шаблонный класс из него, затем специализируйте производный класс только с функциями, которые отличаются.