Я создаю нестандартный тип. В идеале это было бы как можно более взаимозаменяемо с базовым типом. С этой целью я перегрузил все операторы класса и предоставил шаблонный конструктор для принятия всех основных типов. Оценка смешанных типов всегда способствует моему такому типу.Пользовательские типы, типы конверсий, с которыми конфликтуют операторы?
auto result = 5/mycustomtype * 2.0f; // result is of type MyCustomType
Теперь я представил реализации для операторов int, float и double. В идеале приемы должны работать, поскольку пользователи могут ожидать их для любого типа.
Это добавление напечатанного материала операторов, поставили меня в нечетном месте:
С кодом:
if (mycustomtype > 5) { ... }
Компилятор видит много возможностей, включая этот пример:
if (mycustomtype > MyCustomType(5)) { ... }
или
if ((int)mycustomtype > 5) { ... }
Как таковой он дает мне ошибку для каждой возможной комбинации типов, к которым он мог бы преобразоваться. Я понимаю, почему у него есть все эти варианты, но я застрял в том, как я могу это разрешить. Простой выход, чтобы не поддерживать преобразования типов в этой манере и скорее обеспечивает интерфейс, как:
auto f = mycustomtype.As<float>()
Однако было бы очень здорово, если бы мне торт и съесть его.
PS: Пример вывода ошибки -
c:\...\MyType.cpp(106): error C2666: 'MyType< template params >::operator >=' : 4 overloads have similar conversions
with
[
template specializations...
]
c:\...\MyType.h(63): could be 'bool MyType<...>::operator >=(const MyType<...> &) const'
with
[
template specializations...
]
or 'built-in C++ operator>=(float, double)'
or 'built-in C++ operator>=(int, double)'
or 'built-in C++ operator>=(double, double)'
while trying to match the argument list '(MyType, double)'
К сожалению, я использую VS2012, и это не кажется, поддерживает явное операторы. Стандартом компании по-прежнему является VS2012, поэтому обновление не является вариантом. Спасибо за ответ tho :) Я не знал, что операторы могут быть явными. Много приятных вещей в C++ 11! – qeadz
После некоторого очень исчерпывающего поиска до и после задавания этого вопроса кажется, что Дэнвилл прав. Кажется, что создание операторов-операторов типов является единственным способом. Думаю, я откажусь от поддержки, пока мы не воспользуемся компилятором, который сможет это сделать. Спасибо за помощь. – qeadz