使用许多类型转换操作符重载时出现模糊的重载

时间:2016-06-21 23:35:40

标签: c++ pointers operator-overloading wrapper smart-pointers

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

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

int main(){
   wrappedString wrappedStringObject;

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

   wrappedString anotherWrappedStringObject;

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

以下是该课程的重要部分:

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)和operator ==(string *,string *)

1 个答案:

答案 0 :(得分:0)

多个隐式转换运算符导致此问题。如果目标是让包裹的string对象表现得像string(实际上是char*?!?),那么只允许一个隐式强制转换运算符,而剩下的explicit { {1}}以减少不当行为的风险。这仅适用于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*重载。