Вызов не шаблонной функции из шаблонной функции - PullRequest
2 голосов
/ 19 апреля 2019

Я пытаюсь вызвать функцию-член из функции-члена шаблона, но жалуется на отсутствие перегрузок для функции-члена.Как мне это исправить?Ниже приведен тестовый код.

class Test
{
public:
    template <typename T>
    void foo(int i, T param)
    {
        switch (i)
        {
        case 1:
            fun(param);
            break;
        case 2:
            bar(param);
        }
    }
    void fun(string p)
    {
        std::cout << "string: " << p << std::endl;
    }
    void bar(double p)
    {
        std::cout << "double: " << p << std::endl;
    }
};

int main() {
    Test t;
    t.foo(1, "hello");
    t.foo(2, 100.0);
    return 0;
}

ошибка: не найдена соответствующая функция для вызова метода Test :: fun (double &) *

Ответы [ 2 ]

3 голосов
/ 19 апреля 2019

Кажется, вы хотите вызвать fun или bar, зависит от param параметра foo.Если вы используете c ++ 17, вы можете использовать if constexpr для этого:

class Test
{
public:
    template <typename T>
    void foo(T param)
    {
        if constexpr (is_same_v<T,string> || is_same_v<T,const char*>)
            fun(param);
        else if (is_same_v<T,double>)
            bar(param);
    }

    void fun(string p)
    {
        std::cout << "string: " << p << std::endl;
    }

    void bar(double p)
    {
        std::cout << "double: " << p << std::endl;
    }
};

int main() {
    Test t;
    t.foo("hello");
    t.foo(100.0);
    return 0;
}

и int i параметр foo здесь не нужен, вы решаете, какой fun / bar вызывается по типу param.

1 голос
/ 19 апреля 2019

Для данного типа typename T шаблон функции может быть создан только в том случае, если все операторы в теле функции являются действительными. В частности, это касается как ваших fun, так и bar вызовов.

Чтобы исправить это, сначала нужно исправить дизайн. Из того, что потеет из вашего примера кода, я думаю, вы хотите что-то похожее на:

void foo(double param)
{
    bar(param);
}

void foo(string param)
{
    fun(param);
}
...