неоднозначная перегруженная функция отличается только параметром шаблона аргумента - PullRequest
1 голос
/ 19 марта 2019

Рассмотрим следующий код:

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

Как бы я переписал это, чтобы оно не вызывало "ошибку C2668: неоднозначный вызов перегруженной функции"?

Примечание: я хотел бычтобы можно было также передавать в подкласс, например, SmartPointer<SubclassOfDataWrapper>, и иметь это разрешение для перегруженной функции суперкласса.

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Проверьте, есть ли в вашем классе интеллектуальных указателей оператор преобразования шаблонов.

Что еще более важно, проверьте, есть ли что-то для SFINAE, из оператора преобразования в случае, если преобразование недопустимо.

Статическое утверждение внутри оператора преобразования не скажет компилятору, что эти перегрузки не являются неоднозначными.

0 голосов
/ 19 марта 2019

Благодаря подсказке Гийома Рацико я придумал следующее решение:

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 */ };
}
...