在c ++中重载int和char的运算符

时间:2015-04-26 09:05:47

标签: c++ char operator-overloading

我希望有一个类可以接受来自int和int以及字符串文字的赋值。事实证明,字符串文字必须是char []类型。实际上我有很多数据类型都是由赋值运算符成功采用的。但编译器在这两者之间感到困惑。我得到了char与int的可互换性,我经常用它来进行快速的ascii比较。我想知道的是,是否有办法让编译器停止尝试将字符串文字发送到重载运算符的int版本。没有其他类型有这个问题,只有这两个类型混淆了。

    myDataType& operator = (int Right);
    myDataType& operator = (const char &Right);

当我尝试:

myDataType Test;

Test = "Hello World.";

编译器尝试将字符串文字解释为int并抛出此错误:错误:从'const char *'到'int'的无效转换[-fpermissive]

感谢。

2 个答案:

答案 0 :(得分:4)

如果字符串必须是char[]类型,则签名中必须有[]*

myDataType& operator = (int Right);
myDataType& operator = (const char *Right);

myDataType& operator = (int Right);
template<size_t N>
myDataType& operator = (const char (&Right)[N]);

但是,因为这是C ++,实际使用string

可能更简单
myDataType& operator = (int Right);
myDataType& operator = (std::string Right);

答案 1 :(得分:1)

我的猜测是编译器正在尝试实际使用构造函数,因为您的运算符不是好类型。你应该给我们完整的错误信息,而不仅仅是最后一条。

字符串litteral是const char *而不是const char &

我可以使用以下代码重现它:struct Foo {

struct Foo{
    Foo(){}
    Foo(int test){}
    Foo& operator = (int Right){printf(" =(int)");}
    Foo& operator = (const char Right){printf("=(const char &)");}
};

int main(int, char**)
{
    Foo foo;
    foo = "ttt";
    return 0;
}

给了我以下输出:

main.cpp: In function 'int main(int, char**)':
main.cpp:13:9: error: ambiguous overload for 'operator=' (operand types are 'Foo' and 'const char [4]')
     foo = "ttt";
         ^
main.cpp:13:9: note: candidates are:
main.cpp:6:10: note: Foo& Foo::operator=(int) <near match>
     Foo& operator = (int Right){printf(" =(int)");}
          ^
main.cpp:6:10: note:   no known conversion for argument 1 from 'const char [4]' to 'int'
main.cpp:7:10: note: Foo& Foo::operator=(const char&) <near match>
     Foo& operator = (const char &Right){printf("=(const char *)");}

但是,以下代码很好:

struct Foo{
    Foo(){}
    Foo(int test){}
    Foo& operator = (int Right){printf(" =(int)");}
    Foo& operator = (const char *Right){printf("=(const char *)");}
};

如果您希望编译器不要隐式转换参数,请使用explicit关键字,如下所示:

struct Foo{
    explicit Foo(int test){}
};

这将告诉编译器该构造函数将接受int,并且只接受int作为参数类型。因此,指针不会使用此构造函数。有关详情,请查看cppreference.com上的SO questionexplicit keyword