模棱两可的重载函数仅参数的模板参数不同
ambiguous overloaded function differs only by argument's template parameter
考虑以下代码:
SmartPointer<Data> Fix(SmartPointer<Data> data)
{
return { /* Fixed Data */ };
}
SmartPointer<Data> Fix(SmartPointer<DataWrapper> dataWrapper)
{
return Fix(dataWrapper->Data());
}
我该如何重写它才不会导致 "error C2668: ambiguous call to overloaded function"?
注意:我也希望能够传入一个子类,例如 SmartPointer<SubclassOfDataWrapper>
,并将其解析为超类的重载函数。
检查你的智能指针中是否有模板转换运算符class。
更重要的是,如果转换无效,请检查是否有 SFINAE 输出转换运算符。
转换运算符内的静态断言不会告诉编译器这些重载没有歧义。
感谢Guillaume Racicot提供的提示,我想出了以下解决方案:
template<typename T>
SmartPointer<Data> Fix(SmartPointer<T> dataWrapper)
{
// Note: only a subclass of DataWrapper would have the method ->Data()
// a subclass of Data would not have it (SFINAE principle)
return Fix( dataWrapper->Data() );
}
template<>
SmartPointer<Data> Fix(SmartPointer<Data> data)
{
return { /* Fixed Data */ };
}
考虑以下代码:
SmartPointer<Data> Fix(SmartPointer<Data> data)
{
return { /* Fixed Data */ };
}
SmartPointer<Data> Fix(SmartPointer<DataWrapper> dataWrapper)
{
return Fix(dataWrapper->Data());
}
我该如何重写它才不会导致 "error C2668: ambiguous call to overloaded function"?
注意:我也希望能够传入一个子类,例如 SmartPointer<SubclassOfDataWrapper>
,并将其解析为超类的重载函数。
检查你的智能指针中是否有模板转换运算符class。
更重要的是,如果转换无效,请检查是否有 SFINAE 输出转换运算符。
转换运算符内的静态断言不会告诉编译器这些重载没有歧义。
感谢Guillaume Racicot提供的提示,我想出了以下解决方案:
template<typename T>
SmartPointer<Data> Fix(SmartPointer<T> dataWrapper)
{
// Note: only a subclass of DataWrapper would have the method ->Data()
// a subclass of Data would not have it (SFINAE principle)
return Fix( dataWrapper->Data() );
}
template<>
SmartPointer<Data> Fix(SmartPointer<Data> data)
{
return { /* Fixed Data */ };
}