下面的代码:
我有些惊讶我的typedef在这里没有引发更强的类型匹配。我该如何运行这个运算符重载?
编辑:进一步澄清,此代码的目的是我正在对一组Arduino库进行双重定位。它们经常使用以下方式管理字符串:
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: 错误:使用重载运算符'<<'不明确 (操作数类型为'basic_ostream>'和'const HELPER *'(即'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在这里没有引发更强的类型匹配。我该如何运行这个运算符重载?
编辑:进一步澄清,此代码的目的是我正在对一组Arduino库进行双重定位。它们经常使用以下方式管理字符串:
typedef void __FlashStringHelper;
void showHelp(const __FlashStringHelper* helpText)
{
Serial.print(helpText);
}
我喜欢iostream并计划使用双目标,所以我在Serial对象上重载了<<,并将之前的内容改为(这是简化的版本,仅供参考)
#define cout Serial
void showHelp(const __FlashStringHelper* helpText)
{
cout << helpText;
}
现在我想要实际针对不同的架构目标真正的iostream,但旧的Arduino代码不能太多地改变其__FlashStringHelpers。这就是我的问题所在。
HELPER
基本上只是void
的别名。因此,你有两个重载版本的const void*
(你的和标准的),再加上指针可以隐式转换为bool
,这给了你第三种选择。 - Some programmer dude