gpt4 book ai didi

C++加法重载歧义

转载 作者:太空狗 更新时间:2023-10-29 23:23:03 25 4
gpt4 key购买 nike

我在我的代码库中遇到了一个棘手的难题。我不太清楚为什么我的代码会生成此错误,但(例如)std::string 不会。

class String {
public:
String(const char*str);
friend String operator+ ( const String& lval, const char *rval );
friend String operator+ ( const char *lval, const String& rval );
String operator+ ( const String& rval );
};

这些的实现很容易自己想象。

我的驱动程序包含以下内容:

String result, lval("left side "), rval("of string");
char lv[] = "right side ", rv[] = "of string";
result = lv + rval;
printf(result);
result = (lval + rv);
printf(result);

在 gcc 4.1.2 中生成以下错误:

driver.cpp:25: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
String.h:22: note: candidate 1: String operator+(const String&, const char*)
String.h:24: note: candidate 2: String String::operator+(const String&)

到目前为止还不错吧?遗憾的是,我的 String(const char *str) 构造函数作为隐式构造函数非常方便,使用 explicit 关键字来解决这个问题只会导致一堆不同的问题。

此外... std::string 不必求助于此,我不明白为什么。例如,在basic_string.h中,它们声明如下:

template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>
operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)

template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT,_Traits,_Alloc>
operator+(const _CharT* __lhs,
const basic_string<_CharT,_Traits,_Alloc>& __rhs);

等等。 basic_string 构造函数未显式声明。这怎么不会导致我遇到的相同错误,我怎样才能实现相同的行为??

最佳答案

产生歧义的原因是,只有当一个候选函数的参数没有比另一个的参数匹配更差时,一个候选函数才比另一个候选函数好。考虑你的两个功能:

friend String operator+(const String&, const char*); // (a)
String operator+(const String&); // (b)

您正在使用 Stringconst char* 调用 operator+

const char* 类型的第二个参数显然匹配 (a) 优于 (b)。对于(a)是完全匹配,但对于(b)需要用户定义的转换。

因此,为了避免歧义,第一个参数必须比 (a) 更好地匹配 (b)。

operator+ 调用左侧的String 不是const。因此,它匹配 (b),这是一个非常量成员函数,比 (a),它接受一个 const String&

因此,以下任何一种解决方案都可以消除歧义:

  • 改变成员operator+为const成员函数
  • 将非成员 operator+ 更改为采用 String& 而不是 const String&
  • 调用 operator+ 并在左侧添加一个 const String

显然,第一个,also suggested by UncleBens , 是最好的方法。

关于C++加法重载歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2613645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com