Следующий код:Использование перегруженного оператора неоднозначным
typedef void HELPER;
const HELPER* helper = _helper;
inline ostream& operator <<(ostream& out, const HELPER* arg)
{ out << (const char*)(arg); return out; }
взрывает если попытаться
cout << helper;
В частности, я получаю:
main.cpp:35:28: error: use of overloaded operator '<<' is ambiguous (with operand types 'basic_ostream >' and 'const HELPER *' (aka 'const void *'))
и перечисляет несколько кандидатов :
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/ostream:207:0: note: candidate function
basic_ostream& operator<<(const void* __p);
^
main.cpp:25:17: note: candidate function
inline ostream& operator <<(ostream& out, const HELPER* arg)
^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/ostream:195:20: note: candidate function
basic_ostream& operator<<(bool __n);
^
Я немного удивлен, что мой typedef не вызывает более сильного типа, соответствующего здесь. Как я могу запустить эту перегрузку оператора?
EDIT: Дальнейшее разъяснение, цель этого кода заключается в том, что я настроен с двойным таргетингом на набор библиотек Arduino. Они управляют своими строками часто с:
typedef void __FlashStringHelper;
void showHelp(const __FlashStringHelper* helpText)
{
Serial.print(helpText);
}
Я iostream и планировал на этой двойной цели нравится, поэтому я перегружен < < на Последовательная объекта и сделал предыдущий в (это упрощенно версия, например)
#define cout Serial
void showHelp(const __FlashStringHelper* helpText)
{
cout << helpText;
}
Теперь я хочу на самом деле нацелиться на реальный iostream для другой арки, но старый код Arduino не может сильно отличаться от его __FlashStringHelpers. Вот где я в
Ваш символ 'HELPER' в основном только * псевдоним * для' void'. Таким образом, у вас есть две перегрузки для 'const void *' (ваш и стандарт) плюс эти указатели могут быть неявно преобразованы в 'bool', что дает вам третью альтернативу. –
typedef не вводит новый тип. – Danh
И какова * актуальная * проблема, которую вы хотите решить с помощью предлагаемого вами решения? Почему вы сделали такую перегрузку? В чем его цель?Может быть, мы сможем помочь вам в этом? См. Некоторые связанные чтения о [проблема XY] (http://xyproblem.info/). –