我在Null类下面设计了泛型编程,我可以做一些像TA = Null()的东西,除了std :: string之外一切正常,编译器无法找到合适的运算符==并给我很多错误。问题是为什么其他类型可以正常运作?我做错了什么?
struct Null
{
operator std::string() const { return std::string{}; }
operator int() const { return 0; }
};
int main() {
std::string s = "hello";
Null n;
std::cout << (0 == n) << std::endl; // works
std::cout << (n == 0) << std::endl; // works
std::cout << (s == n) << std::endl; // error: no match for operator==
}
答案 0 :(得分:4)
这里使用的==
实际上是:
template< class CharT, class traits, class Alloc >
bool operator==( const basic_string<CharT,Traits,Alloc>& lhs,
const basic_string<CharT,Traits,Alloc>& rhs );
用户定义的转换序列不考虑模板类型推导,因此不能在此处(或其他)推导出CharT
参数。
要解决此问题,您可能需要定义自己的非模板operator==
。