Null <std :: string> </std :: string>的问题

时间:2014-12-24 04:22:15

标签: c++ templates

我在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==
}

1 个答案:

答案 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==