为什么<iostream>运算符<<会选择明显错误的重载?
Why does <iostream> operator<< pick the apparently wrong overload?
请考虑以下代码:
#include <iostream>
using namespace std;
class X {
public:
operator const wchar_t* () const { return L"Hello"; }
};
void f(const void *) {
wcout << L"f(const void*)n";
}
void f(const wchar_t*) {
wcout << L"f(const wchar_t*)n";
}
int main() {
X x;
f(x);
wcout << x;
}
输出为(使用 VS2015 C++编译器编译(:
f(const wchar_t*) 00118B30
因此,编译器似乎为f
选择了预期的const wchar_t*
重载(因为存在从X
到const wchar_t*
的隐式转换(。
但是,似乎wcout << x
选择const void*
重载,而不是const wchar_t*
重载(打印地址,而不是wchar_t
字符串(。
这是为什么呢?
附言我知道打印X
的正确方法是实现像wostream& operator<<(wostream& , const X&)
这样的operator<<
重载,但这不是问题的重点。
因为在推导模板参数时不考虑转换函数:
// Non-template member function.
basic_ostream& basic_ostream::operator<<( const void* value );
// Template non-member function.
template< class CharT, class Traits >
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
const CharT* s );
第二个声明不考虑转换operator const wchar_t* () const
。
我找不到标准报价,cpp首选项模板参数推导,隐式转换 说:
类型推断不考虑隐式转换(上面列出的类型调整除外(:这是重载解决的工作,稍后会发生。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- &lt;&lt;操作员在C 中超载错误
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- '&lt;'''&lt;'''&quot的模板类错误''令牌”
- 在尝试超载&lt;&lt;时链接错误2005和1169操作员
- 错误:没有匹配'运算符<<"在'std::cout
- 过载<<比如cout错误
- 重载& lt; & lt;为什么我得到以下错误
- 重载ostream&时转换错误无效;operator< & lt;
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多
- 编译器错误,包括'<'代币
- 重载& lt; & lt;错误