使用许多类型转换运算符重载时模棱两可的重载
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*
重载。
我想为字符串创建一个 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*
重载。