Невозможно преобразовать аргументы шаблона для соответствия аргументам функции - PullRequest
0 голосов
/ 25 мая 2020

У меня есть 3 функции в файле заголовка

template <typename T>
const T &minD(T const& a, T const& b)
{
    if (a > b)
    {
        return b;
    }
    else
    {
        return a;
    }
}

Это целевая функция, с которой я пытаюсь сопоставить параметры с аргументами

char *minD(char * a, char * b)
{
    if (strcmp(a, b) > 0)
    {
        return b;
    }
    else
    {
        return a;
    }
}

Это функция, которая должна вызывать обе функции, описанные выше, в зависимости от типов параметров.

template <typename T>
const T &minD(T const &a, T const &b, T const &c)
{
    return minD(minD(a, b), c);
}

Моя цель состоит в том, если данные аргументы в приведенной выше функции соответствуют типу char * необходимо вызвать minD с аргументами типа char *. Если тип аргумента - любой другой тип, он должен вызывать первую функцию, которая имеет аргументы типа шаблона.

Первое, что я сделал, это попытался вызвать minD (minD (& a, & b), & c) и изменить function2 на const char *minD(const char * a, const char * b), но компилятор говорит, что не может преобразовать const T * в const char *. Второе, что я сделал, - это изменить тип параметра второй функции на const char * minD(const char& a, const char& b) и вызвать функцию с minD(minD(a, b), c), но затем компилятор выдает ошибку о возможной потере данных из преобразования const T в const char.

Здесь следует отметить одну вещь: я не могу изменить тип параметра

template <typename T>
const T &minD(T const &a, T const &b, T const &c)

Примеры вызовов функций:

val = minD(42, 7, 68);

Этот вызов является вызовом функции для 3-я функция, а затем 3-я функция должна вызвать 1-ю функцию, чтобы получить правильный ответ.

const char *  const s0 = "CSC";
const char *  const s1 = "461";
const char *  const s2 = "Optimized C++";
s = minD(s0, s1, s2);

Этот вызов является вызовом функции 3-й функции, а затем 3-я функция должна вызвать 2-ю функцию чтобы получить правильный ответ.

Я не могу понять, что я здесь делаю не так. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 26 мая 2020

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

Оказывается, вероятно, нет способа изменить эти 3 заданные функции, чтобы они соответствовали оба сценария ios.

Итак, моим решением было добавить перегруженный метод minD:

template <typename T>
const T* minD(const T* a, const T* b, const T* c)
{
    return minD(minD(a, b), c);
}

Кроме того, я изменил подпись minD двумя параметрами char *, например:

const char *minD(const char * a, const char * b)

Теперь при этом вызове

val = minD(42, 7, 68);

Он сопоставляет функцию minD с 3 параметрами const T & и изнутри вызывает minD с 2 параметрами const T &. Однако в этом вызове

const char *  const s0 = "CSC";
const char *  const s1 = "461";
const char *  const s2 = "Optimized C++";
s = minD(s0, s1, s2);

он сопоставляет недавно добавленную функцию minD с 3 параметрами char *, которая, в свою очередь, вызывает обновленную функцию minD с 2 параметрами char *.

Следовательно, она решает эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...