При обновлении до Xcode 7.1 вы можете увидеть этот тип ошибки, и он не может быть разрешен ни одним из приведенных выше ответов. Одним из симптомов в моем случае было то, что приложение работает на устройстве не в симуляторе. Вероятно, вы увидите огромное количество ошибок, связанных со значительной частью всех используемых вами фреймворков.
Исправление на самом деле довольно простое. Вам просто нужно удалить запись из параметра «Пути поиска в Ракурсе», найденного в разделе TARGETS> Build Settings> Search Paths (убедитесь, что выбрана вкладка «Все»)
Если вы видите другую запись (помимо $ (унаследованной)) для своей основной цели или вашей целевой цели, просто удалите неисправный путь из всех целей и перестройте.
Почему здесь выбрано
blockquote>operator=(int)
вместо «двусмысленного» или другого?
{}
-int
- это преобразование идентичности ( [over.ics.list] / 9 [/ д0]).{}
-S
- пользовательское преобразование ( [over.ics.list] / 6 ) (технически это{}
доconst S&
и проходит через [over.ics .list] / 8 и [over.ics.ref], прежде чем вернуться к [over.ics.list] / 6).Первый выигрыш.
Есть ли способ обхода?
blockquote>Вариант трюка
std::experimental::optional
тянет, чтобыt = {}
всегда делалt
пустым. Ключ должен сделать шаблонoperator=(int)
. Если вы хотите принятьint
и толькоint
, тогда он станетtemplate<class Int, std::enable_if_t<std::is_same<Int, int>{}, int> = 0> S& operator=(Int t) { a = t; return *this; }
. Если вы хотите включить конверсии, вы можете использовать различные ограничения (вы, вероятно, также захотите принять аргумент ссылка в этом случае).
Суть в том, что, создав параметр правильного операнда для параметра шаблона, вы блокируете
t = {}
, используя эту перегрузку, потому что{}
- это не выводимый контекст.... без изменения
blockquote>S
?Считает ли
template<class T> T default_constructed_instance_of(const T&) { return {}; }
, а затемs = default_constructed_instance_of(s);
?
Прежде всего, случай не имеет ничего общего с «int» версией оператора присваивания, вы можете просто удалить его. Вы также можете удалить другой оператор присваивания, так как он будет сгенерирован компилятором. IE такого типа автоматически получает конструкторы копирования / перемещения и оператор присваивания. (т. е. они не запрещены, и вы просто повторяете то, что компилятор делает автоматически с явным обозначением)
В первом случае
используется инициализация копирования :
S s = {}; // the default constructor is invoked
Это назначение пост-строительной копии, но компиляторы оптимизируют такие простые случаи. Вместо этого вы должны использовать инициализацию направления :
S s{}; // the default constructor is invoked (as you have it)
Примечание: вы также можете записать:
S s; // the default constructor is invoked if you have it
Второй случай
То, что вы должны написать, это прямая инициализация правой стороны назначения копии:
t = S{};
В этой нотации будет вызываться конструктор по умолчанию (если он есть) или инициализация значения для членов (пока тип является агрегатом). Вот соответствующая информация: http://en.cppreference.com/w/cpp/language/value_initialization
template<typename T> void reset(T &t) { t = T{}; }
– M.M 4 November 2015 в 04:02