T
как тип должен быть определен в общем экземпляре класса. Следующий пример работает:
public class Test<T> {
private Map<Class<T>, T> defaultValues;
public void setDefaultValue(Class<T> clazz, T value) {
defaultValues.put(clazz, value);
}
public T getDefaultValue(Class<T> clazz) {
return defaultValues.get(clazz);
}
}
В качестве альтернативы вы можете использовать ответ Павла Томблина и обернуть Map
своим собственным объектом, который будет применять этот тип дженериков.
Измените стандартную библиотеку, которая связана с использованием libstdc++
вместо libc++
- проблема в том, что другая библиотека была скомпилирована с использованием режима g++
, который использует библиотеку libstdc++
.
Рассмотрим следующий пример кода:
dhcp-191:~/Development/testy/fred% cat fred.cpp
#include <iostream>
#include <string>
#include "fred.h"
using namespace std;
bool dofred(string &x)
{
cout << x << endl;
return true;
}
dhcp-191:~/Development/testy/fred% cat fred.h
#include <iostream>
#include <string>
bool dofred(std::string &x);
dhcp-191:~/Development/testy/fred% clang++ -stdlib=libc++ -shared -o fred.dylib fred.cpp
dhcp-191:~/Development/testy/fred% nm fred.dylib | c++filt | grep dofred
0000000000000fa0 T dofred(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&)
dhcp-191:~/Development/testy/fred% clang++ -stdlib=libstdc++ -shared -o fred.dylib fred.cpp
dhcp-191:~/Development/testy/fred% nm fred.dylib | c++filt | grep dofred
0000000000000e30 T dofred(std::string&)
Вы получите два совершенно разных экспортированных символа. При попытке использовать символ приложение, которое использует тот же флаг -stdlib
, сможет связываться, в то время как приложение, которое не отображает ошибку ссылки.
В iOS 7 я использую библиотеку для диаграмм и имею ту же проблему. В этом случае lib stdc ++ не решает проблему.
Я добавляю stdc ++. 6.dylib к моей фазе сборки, и символы найдены.
У меня просто была похожая проблема, и мне пришлось перейти в «Настройки сборки», а затем «Apple LLVM 5.1 - Язык - C ++», а затем изменить «Стандартная библиотека C ++» на libstdc ++.
Вы также можете попробовать добавить пустой файл .cpp в ваш проект. Это обманом заставит xcode загружать стандартные библиотеки C ++
В ответ на джлюканта: у меня была такая же проблема. Я был осторожен, чтобы выбрать правильный ЗППП, но я все еще получил эти ошибки. Но это не ошибка, на самом деле это имеет смысл: зачем XCode ссылаться на c ++ stdlib, если у вас нет кода C ++ в вашем проекте?
Конечно, это проблема, когда вы этого не делаете. есть код C ++ в вашем проекте, но все еще библиотеки C ++.
У меня была эта проблема после помещения всех файлов C ++ в отдельную библиотеку. Я установил настройки всех проектов для использования libc ++, но компоновщик не связывается с libc ++. Если я добавлю файл C ++ в основной проект, проблема исчезнет. Чтобы это исправить, вы можете добавить '-lc ++' в раздел «Другие флаги компоновщика» основного проекта. Это заставит XCode ссылаться на libc ++.
РЕДАКТИРОВАТЬ: Как сказал другой постер, XCode может вести себя правильно. Я ожидал, что он узнает о добавлении связи C ++, потому что исходный код C ++ lib находится в той же рабочей области.