运算符重载失败,运算符为[],运算符转换为int

时间:2014-10-21 13:53:35

标签: c++ visual-studio-2013 operator-overloading

以下程序无法在VS 2013 SP3上编译。问题是什么?如何避免这种情况?

#include <string>

class Test
{
public:
    operator int()      const   
    { 
        return 42; 
    }
    inline Test *operator[](const std::string &name)
    {
        return this;
    }
};

int main(int argc, char* argv[])
{
    Test ts;
    Test *k = ts["huhu"];
    return 0;
}

输出是: C2666:数字重载具有类似的转换

1 个答案:

答案 0 :(得分:4)

编译器是正确的。这段代码有两种解释:

  1. 用户定义的运算符[]和字符串转换

    ts.operator[](std::string("huhu"))
    
  2. 内置运算符[]和int转换

    *(int(ts) + "huhu")
    
  3. 这两个都需要一个用户定义的转换,所以它们都是&#34;好&#34;。

    要修复它,按照Yochai的说法,给它一个operator[]重载,只需要一个标准的数组到指针转换:

    inline Test *operator[](const char* name)
    {
        return operator[](std::string(name));
    }