我希望有一个类可以接受来自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]
感谢。
答案 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 question和explicit keyword