使用许多类型转换运算符重载时模棱两可的重载

Ambiguous overload when using many typecasts operator overloads

我想为字符串创建一个 wrapperClass。我还希望 class 能够 return wrapperClass 的地址和存储(包装)字符串的地址:

void FunctionString(string*);
void FunctionWrappedString(wrappedString*);

int main(){
   wrappedString wrappedStringObject;

   FunctionString(&wrappedStringObject);
   FunctionWrappedString(&wrappedStringObject);

   wrappedString anotherWrappedStringObject;

   if(wrappedStringObject == anotherWrappedStringObject){
    // code
   }
}

以下是 class 的重要部分:

class wrappedString{
   typedef char* string;

   string storedString;

   operator string*(){
      // some code
      return &storedString;
   }

   operator wrapperString*(){
      // some code
      return this;
   }

  operator string(){
    // some code
    return storedString;
  }

}

但是当我使用比较运算符时这些失败了:

if(wrappedStringObject == anotherWrappedStringObject){
  // code
}

说候选项是:operator==(string,string) and operator==(string*,string*)

多个隐式转换运算符导致此问题。如果目标是让包装的 string 对象表现得像 string(实际上是 char*?!?),则只允许一个隐式转换运算符,同时保留其余 explicit 以减少不当行为的风险。这只适用于 C++11,但无论如何你现在应该使用它:

class wrappedString{
   typedef char* string;

   string storedString;

   explicit operator string*(){
      // some code
      return &storedString;
   }

   explicit operator wrapperString*(){
      // some code
      return this;
   }

   operator string(){
     // some code
     return storedString;
   }

}

根据该定义,if(wrappedStringObject == anotherWrappedStringObject){ 将仅使用 string 重载,而不使用 string* 重载。