1

考虑以下代码:

SmartPointer<Data> Fix(SmartPointer<Data> data)
{
    return { /* Fixed Data */ };
}
SmartPointer<Data> Fix(SmartPointer<DataWrapper> dataWrapper)
{
    return Fix(dataWrapper->Data());    
}

我将如何重写它以使其不会导致“错误 C2668:对重载函数的模糊调用”?

注意:例如,我也希望能够传入一个子类SmartPointer<SubclassOfDataWrapper>,并将其解析为超类的重载函数。

4

2 回答 2

1

检查智能指针类中是否存在模板转换运算符。

更重要的是,如果转换无效,请检查转换运算符是否有 SFINAE-out。

转换运算符中的静态断言不会告诉编译器这些重载不是模棱两可的。

于 2019-03-19T00:04:55.640 回答
0

感谢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 */ };
}
于 2019-03-19T00:20:21.827 回答